与我的其他帖子有关:
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?
中答案 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))