3 votes

comment puis-je passer des arguments (noms) à une fabrique de fonctions ?

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X