2017-02-16 19 views
1

Я пытаюсь передать довольно много аргументов функции (на самом деле это функция инициализации ссылочного класса). Я думаю об использовании трехточечного многоточия для передачи аргументов инициализатору класса, но он не работает. Вот мой пример кода:Как использовать многоточие для передачи аргументов и оценки в другой среде в 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))) 
      } 

Это дает мне сообщение об ошибке:

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

Я не знаю, как оценить кучу аргументов, чтобы инициализировать ссылку на класс? Пожалуйста, поделитесь своими мыслями; заранее спасибо!

ответ

1

Вам действительно нужно отложить оценку параметров? Похоже,

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) 

Будет работать лучше. Если вы хотите расширить параметры для вызова класса, потребности вызова должны быть вызваны с помощью do.call, а не только параметров.

+0

Спасибо! Оно работает. Но мне все еще интересно, могу ли я распустить оценку выражения? – chl111

+0

Мне сложно представить, когда и как это будет полезно. Возможно, вы можете опубликовать новый вопрос с воспроизводимым примером, где это решение не будет работать. – MrFlick