2017-02-16 5 views
1

J'essaie de transmettre pas mal d'arguments à une fonction (en fait, c'est une fonction de classe initialize de référence). Je songe à utiliser trois points d'ellipse pour transmettre des arguments à l'initialiseur de classe, mais cela ne fonctionne pas. Voici mon exemple de code:Comment utiliser des points de suspension pour transmettre des arguments et évaluer dans un autre environnement dans R

SomeClass<-setRefClass("SomeClass", 
         fields=list(a="numeric",b="numeric",c="character")) 

SomeClass_1<-setRefClass("SomeClass_1",contains="SomeClass") 

SomeClass_2<-setRefClass("SomeClass_2",contains="SomeClass") 

getExpression<-function(...){ 
    return(substitute(list(...))) 
} 

ex1<-getExpression(a=1:3,b=pmax(2:4,3:5),c=c("test","test1","test2")) 

d<-TRUE 

if(d){ 
    newclass<-SomeClass_1(do.call(eval,as.list(ex1))) 
    }else{ 
    newclass<-SomeClass_2(do.call(eval,as.list(ex1))) 
      } 

Il me donne des messages d'erreur:

Error in (function (expr, envir = parent.frame(), enclos = if  (is.list(envir) || : 
    unused arguments (a = 1:3, b = pmax(2:4, 3:5), c = c("test", "test1", "test2")) 

Je ne suis pas sûr de savoir comment évaluer un tas d'arguments pour initialiser une classe de référence? S'il vous plaît partagez vos pensées Merci d'avance!

Répondre

1

Avez-vous vraiment besoin de retarder l'évaluation des paramètres? Cela ressemble à

getExpression <- function(...){ 
    return(list(...)) 
} 
ex1 <- getExpression(a=1:3,b=pmax(2:4,3:5),c=c("test","test1","test2")) 
do.call("SomeClass_1", ex1) 
do.call("SomeClass_2", ex1) 

Cela fonctionnerait mieux. Si vous souhaitez développer les paramètres de l'appel de classe, cet appel doit être appelé avec le do.call, pas seulement les paramètres.

+0

Merci! Ça marche. Mais je me demande toujours si je peux décomposer l'évaluation d'expression? – chl111

+0

J'ai du mal à imaginer quand ou comment cela serait utile. Vous pourriez peut-être poster une nouvelle question avec un exemple reproductible où cette solution ne fonctionnera pas. – MrFlick