我不确定我的问题标记是否正确,但我试一试:
我想使用一个带有使用省略号的函数的包,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]])
and 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
but a My_CLass
然后再次get(name,envir=ev)
崩溃。
所以我的问题是:如何在不更改包/底层功能的情况下完成提交列表?我想过写一个包装器,但我被困住了,因为我什至不能func(my_list[[1]])
做工作。也许我只是缺少解决我的问题的正确术语。
提前致谢!
这是可行的,但我对该函数中的设计选择感到困惑:
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(...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)