R:如何使用省略号中的参数等列表元素?

时间:2014-01-29 16:21:02

标签: r list arguments wrapper ellipsis

我不确定我的问题是否正确,但我试了一下:

我想使用包含使用省略号func(...)的函数的包。类My_Class的所有参数都在列表中。由于我有很多论点,我想避免func(arg1, arg2, arg3)。理想情况下,我想做func( my_list )。问题是该函数看起来像这样

function(...) {
  cl <- match.call(expand.dots = FALSE)
  names <- lapply(cl[[2]],as.character)  
  ev <- parent.frame()
  classes <- unlist(lapply(names,function(name){class(get(name,envir=ev))}))    
  if( !all( classes == "My_Class" ) ) { 
    stop("an argument to ... is not a My_Class")
  }
}

因此传递列表不起作用。

我也尝试了func(my_list[[1]], my_list[[2]])func(as.expression(my_list[[1]])),但即使它们不起作用。由于func将参数视为字符,func(my_list[[1]])内部变为chr [1:3] "[[" "my_list" "1"get(name,envir=ev)崩溃。我还尝试了do.call(func, my_list),但在评估my_list时再次崩溃,因此函数内的name不再是character而是My_CLass而且get(name,envir=ev)再次func(my_list[[1]]) 1}}崩溃。

所以我的问题:如何在不更改包/基础功能的情况下完成列表交付?我想过写一个包装器,但是我被卡住了,因为我甚至无法{{1}}开始工作。也许我只是错过了我的问题的正确用语。

提前致谢!

1 个答案:

答案 0 :(得分:3)

这很有效,但我对该功能的设计选择感到困惑:

lst <- list(
  a=structure(1:3, class="My_Class"), 
  b=structure(letters[1:3], class="My_Class")
)
env <- list2env(lst)
call <- as.call(append(list(fun), names(lst)))
eval(call, env)

要使该功能变得有效,您必须在列表项为对象的环境中对其进行评估(这是list2env所做的,创建该环境)。

关于该函数的一个可怕的事情是,它根据它们的名称在parent.frame中查找对象,假设...值确实是名称。我真的不明白为什么这个功能不仅仅是这样:

if(!all(vapply(list(...), class, "") == "My_Class")) stop(...)