复制函数调用中的参数个数?

时间:2014-05-23 21:35:57

标签: r

与我的其他帖子有关:

https://stackoverflow.com/questions/23838396/faster-combn-expand-grid-with-rcpp

如果我有一个名为ids的字符向量,我想这样做:

expand.grid(ids,ids)
expand.grid(ids,ids,ids)
expand.grid(ids,ids,ids,ids)
expand.grid(ids,ids,ids,ids,ids)

我想写一个函数,我可以:

n_args <- function(var,n, fun)

所以我可以致电:

result <- n_args(ids,5,expand.grid)

等同于

result <- expand.grid(ids,ids,ids,ids,ids)

但我坚持:

n=5
rep(quote(var),n)

> Error in rep(quote(var), 5) : 
>  attempt to replicate an object of type 'symbol'

我如何编写这样的函数,或者它是否存在于R?

2 个答案:

答案 0 :(得分:3)

do.call()是按照@nograpes的方式去的。由于错误意味着rep()没有symbol类的方法。

但是如果你真的想要n_args(ids,5,expand.grid)语法呢?我以为我会想出点什么。

替代解决方案?

使用我提出的parse()类型函数:

n_parse <- function(var,n,fun) {
    args_v <- rep(deparse(var),n)
    args_sep <- paste0(args_v,collapse=",")
    fxn_name <- deparse(fun)
    expr <- parse(text=paste0(fxn_name,"(",args_sep,")",collpase=""))
    out <- eval.parent(expr)
    out
}

它为 close 提供了所需的语法:

result <- n_parse( quote(var), 5, quote(expand.grid) )

以及带字符串输入的版本:

n_parse_string <- function(var,n,fun) {

    args_v <- rep(var,n)
    args_sep <- paste0(args_v,collapse=",")
    expr <- parse(text=paste0(fun,"(",args_sep,")",collpase=""))
    out <- eval.parent(expr)
    out
}

使用:

results <- n_parse_string( "ids", 5, "expand.grid")

给出预期的输出。至少它是非标准评估的一点点练习。

答案 1 :(得分:1)

您正在寻找do.call功能。您可以将函数作为其参数之一传递,并传递要传递给该函数的参数列表。这是一个例子。

do.call(expand.grid, rep(list(ids),3))