R:如何使用as.call和vector作为可选参数?

时间:2014-02-03 11:51:23

标签: r list call optional-parameters

我正在尝试为函数编写一个包装器,以便将列表用作输入。我无法更改功能本身,因此我需要一个解决方法。我使用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?,但是遗漏了有关可选参数的细节,现在无法解决。)

1 个答案:

答案 0 :(得分:3)

这在两个版本

下都会产生相同的结果
call <- as.call(c(list(quote(func)), lapply(names(lst), as.name), list(opt=c(3,4))))
g <- eval(call, lst)

编辑:根据哈德利的评论中的建议。

相关问题