【问题标题】:How to use ellipsis to pass arguments and evaluate in another environment in R如何使用省略号在 R 中的另一个环境中传递参数和评估
【发布时间】:2017-07-05 20:20:38
【问题描述】:

我试图将很多参数传递给一个函数(实际上它是一个引用类初始化函数)。我正在考虑使用三个点省略号将参数传递给类初始化程序,但它不起作用。这是我的示例代码:

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

我不确定如何评估一堆参数来初始化引用类?请分享您的想法;提前致谢!

【问题讨论】:

    标签: r arguments lazy-evaluation ellipsis reference-class


    【解决方案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 调用该调用,而不仅仅是参数。

    【讨论】:

    • 谢谢!有用。但我仍然想知道我是否可以衰减表达式评估?
    • 我很难想象这会在何时或如何有所帮助。也许您可以发布一个新问题,并附上一个可重复的示例,说明此解决方案不起作用。
    猜你喜欢
    • 2013-04-25
    • 2019-05-27
    • 1970-01-01
    • 2012-11-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多