R se bloque quand il y a trop d’arguments dans setMethod (ou setGeneric)

Fondamentalement, quand il y a beaucoup d’arguments dans setMethod ou ( setGeneric ), cela fonctionne très lentement.

Voici un exemple de base:

 setClassUnion(name = "mNumeric", members = c("missing", "numeric")) setClass(Class = "classA", representation = representation(ID = "character")) setGeneric("foo", function(r, i, ..., m = 1, D = 1, U = 999, K = 0.005, E1 = -5, E2 = 5, E3 = 1, E4 = 1, E5 = 1, E6 = 1, A1 = -5, A2 = 5, A3 = 1, A4 = 1, A5 = 1, A6 = 1) {standardGeneric ("foo")}) setMethod(f = "foo", signature = c(r = "ANY", i = "classA", m = "mNumeric", D = "mNumeric", U = "mNumeric", K = "mNumeric", E1 = "mNumeric", E2 = "mNumeric", E3 = "mNumeric", E4 = "mNumeric", E5 = "mNumeric", E6 = "mNumeric", A1 = "mNumeric", A2 = "mNumeric", A3 = "mNumeric", A4 = "mNumeric", A5 = "mNumeric", A6 = "mNumeric"), function(r, i, ..., m, D, U, K, E1, E2, E3, E4, E5, E6, A1, A2, A3, A4, A5, A6) {print("Function can made it here..")}) #Program hangs after the following code. (at least five minutes) foo(r = 1, i = new("classA", ID = "ID1")) 

Je constate que ce n’est pas lié à la classe. Vous pouvez mettre une classe numeric dans r et il fera la même chose. Si je réduis le nombre d’arguments, cela fonctionnera.

Je soupçonne qu’il essaie ” to find an inherited method for function 'foo' for signature '"numeric", "classA", "missing", ... ” et cela provoque le blocage de R. VOICI une bonne discussion sur ce sujet.

Parce que si je lance le même code avec moins de parameters, cela fonctionne:

 setGeneric("foo", function(r, i, ..., m = 1, D = 1, U = 999, K = 0.005, E1 = -5, E2 = 5, E3 = 1, E4 = 1) {standardGeneric ("foo")}) setMethod(f = "foo", signature = c(r = "ANY", i = "classA", m = "mNumeric", D = "mNumeric", U = "mNumeric", K = "mNumeric", E1 = "mNumeric", E2 = "mNumeric", E3 = "mNumeric", E4 = "mNumeric"), function(r, i, ..., m, D, U, K, E1, E2, E3, E4) {print("Function can made it here..")}) foo(r = 1, i = new("classA", ID = "ID1")) 

Pourquoi cela arrive? Toutes les idées sont les bienvenues.

J’avais un problème similaire. S4 semble être toutes les combinaisons possibles de signature. Ce qui ralentit les choses. La solution est d’avoir le moins d’éléments possible dans la signature.

Vous pouvez trouver les détails ici https://stat.ethz.ch/pipermail/r-devel/2015-Mai/071092.html