J'ai besoin de construire beaucoup de fonctions avec beaucoup d'arguments différents, bien qu'elles partagent par ailleurs beaucoup de code et de structure. Pour éviter la duplication, j'ai pensé être intelligent et me construire une fabrique de fonctions (aka closure).
Je n'arrive pas à trouver comment passer les arguments de la fonction dans la fabrique de la fonction. .
Mon cas d'utilisation est un ensemble de fonctions de construction S3, qui partagent toutes le même mécanisme de validation. Je vais donc utiliser cet exemple pour expliquer mon problème.
Dites, j'ai un ClassA
y ClassB
qui requièrent chacune leurs propres arguments dans les fonctions de construction respectives :
ClassA <- function(A_arg1, A_arg2) {
# some class-SPECIFIC construction magic happens, say
out <- list(A_arg1, A_arg2)
# some GENERAL construction magic happens
class(out) <- "ClassA"
return(out)
}
ClassB <- function(B_arg1, B_arg2) {
# some class-SPECIFIC construction magic happens, say
out <- B_arg1 + B_arg2
# some GENERAL construction magic happens
class(out) <- "ClassB"
return(out)
}
Évidemment, j'aimerais bien éviter la duplication dans le fichier généralités partie des fonctions du constructeur, donc une fabrique de fonctions qui pourrait être utilisé comme suit serait bien :
ClassA <- produce_class_constructor(classname = "ClassA", fun = function(A_arg1, A_arg2) {return(list(A_arg1, A_arg2))})
Cela devrait, idéalement, donner exactement la même fonction que celle construite manuellement ci-dessus. ClassA
avec la partie générale enlevée.
Voici ma tentative de construction de cette usine de fonctions. :
produce_class_constructor <- function(classname, fun) {
class_specific_arguments <- formals(fun = fun) # this works just fine on the console
construct_class <- function(class_specific_arguments) {
# here runs the class-specific stuff
out <- fun(class_specific_arguments)
# here runs the general stuff
class(out) <- classname
}
}
Cependant, cela ne fonctionne pas, car la fonction constructrice résultante n'a qu'une fonction class_specific_arguments
-l'argument, pas le, eh bien, réel A_arg1
y A_arg2
.
Y a-t-il un moyen de le faire ? Est-ce que je m'y prends mal ?
(Il est très important pour moi que les fonctions du constructeur de la classe résultante aient des arguments correctement nommés, donc un ...
ne fonctionnera pas).