Se cuelga cuando hay demasiados argumentos en setMethod(o setGeneric)
methods dispatch (1)
Básicamente, cuando hay muchos argumentos en setMethod
o ( setGeneric
) funciona muy lentamente.
Aquí hay un ejemplo básico:
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"))
Observo que esto no está relacionado con la clase. Puedes poner una clase numeric
en r
y hará lo mismo. Si recorto el número de argumentos, funcionará.
Sospecho que intenta " to find an inherited method for function ''foo'' for signature ''"numeric", "classA", "missing", ...
" y esto hace que R se cuelgue. HERE hay una buena discusión de este tema.
Porque si ejecuto el mismo código con menos parámetros, funciona:
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"))
¿Por qué sucede esto? Cualquier idea será apreciada.
Tuve un problema similar. S4 parece ser todas las posibles combinaciones de firma. Lo cual ralentiza las cosas a paso de tortuga. La solución es tener tan pocos elementos en la firma como sea posible.
Puede encontrar los detalles aquí https://stat.ethz.ch/pipermail/r-devel/2015-May/071092.html