我不确定我的问题是否正确,但我试了一下:
我想使用包含使用省略号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}}开始工作。也许我只是错过了我的问题的正确用语。
提前致谢!
答案 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(...)