Fondamentalmente, quando ci sono molti argomenti in setMethod
o (setGeneric
) funziona molto lentamente.R si blocca quando ci sono troppi argomenti in setMethod (o setGeneric)
Ecco un esempio di 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"))
osservo che questo non è correlata alla classe. Puoi inserire una classe numeric
in r
e farà lo stesso. Se tagliamo il numero di argomenti funzionerà.
Sospetto che provi "to find an inherited method for function ‘foo’ for signature ‘"numeric", "classA", "missing", ...
" e questo causa il blocco di R. HERE è una buona discussione di questo argomento.
Perché se corro stesso codice con meno parametri funziona:
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"))
perché questo accade? Qualsiasi idea sarà apprezzata.
ho provato senza gli E-variabili - non 5 minuti, ma ancora straordinariamente lunga. Ho osservato che solo la prima volta che viene chiamato foo ci vuole così tanto tempo. La seconda volta è molto veloce. Ho provato a sostituire 'print' da' stop' e lo ho tracciato da 'options (error = traceback)' per vedere tutti i passaggi di chiamata - ma tutto sembra a posto, solo 3 chiamate. Quindi questo è davvero strano ... –
@PatrickRoocks Grazie per la conferma. Credo che la ricerca del metodo richieda così tanto tempo (come spiegato [qui] (http://stackoverflow.com/a/16386422/2275286)). Come hai detto è strano, non si può scrivere alcuna funzione S4 che abbia più di 5-6 input (e iterazioni ogni volta in un nuovo ambiente) se questo è il caso. – HBat
Puoi esplicitamente cronometrare il codice nella tua domanda in modo che le potenziali risposte/soluzioni alternative possano essere confrontate sulla base della riduzione del tempo di sospensione? Ad esempio cambiando l'ultima linea in 'system.time (foo (r = 1, i = new (" classA ", ID =" ID1 "))'. –