我正在尝试为函数编写一个包装器,以便将列表用作输入。我无法更改功能本身,因此我需要一个解决方法。我使用as.call()
并且它没有可选参数,但是当我将向量作为可选参数时,我无法使其工作。
示例:
# function I cannot change
func <- function(..., opt=c(1,2)) {
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))}))
print(c(opt,names, classes))
}
a <- structure(1:3, class="My_Class")
b <- structure(letters[1:3], class="My_Class")
lst <- list(a, b)
names(lst) <- c("a","b")
# Normal result
func(a,b,opt=c(3,4))
# This should give the same but it doesn't
call <- as.call(append(list(func), list(names(lst), opt=c(3,4))))
g <- eval(call, lst)
我没有使用list
作为可选参数,而是尝试c()
,但这也不起作用。有人有建议或帮助页面吗? ?call
并不清楚我的问题。
(我之前已经在这个主题上问了一个问题:R: How to use list elements like arguments in ellipsis?,但是遗漏了有关可选参数的细节,现在无法解决。)
答案 0 :(得分:3)
这在两个版本
下都会产生相同的结果call <- as.call(c(list(quote(func)), lapply(names(lst), as.name), list(opt=c(3,4))))
g <- eval(call, lst)
编辑:根据哈德利的评论中的建议。