向函数中的函数添加(可变数量)参数的字符串

时间:2017-01-05 03:00:33

标签: r function arguments

假设我有一个函数可以根据输入变量的长度创建 x 个对象。然后我希望那些 x 个对象在我提供给我的函数的函数中用作参数。假设我的参数数量是可变的(基于提供的参数名称的数量),我该怎么做?

我可以通过一串参数名称来完成吗?

一个非工作的例子来说明我的要求:

(在这种情况下,使用在函数外部创建的参数来简化示例):

foo <- 1:5
na.rm <- T
func <- mean

f1 <- function(func,arg.names) { 
  func(get(arg.names)) }
f1(func,arg.names = c('foo','na.rm')

如何以get列表中的所有参数的方式执行此操作?

2 个答案:

答案 0 :(得分:2)

我们可以尝试mget

f1 <- function(func,arg.names) { 
      lst <- mget(arg.names, envir = parent.frame())
        func(lst[[1]], na.rm = lst[[2]])
 }

f1(func, arg.names = c('foo', 'na.rm'))
#[1] 3

或另一个选项是do.call(如@ thelatemail&#39;帖子中所述),但将第一个name元素的list更改为&#39; x&#39 ;由于x是&#39;数据&#39; mean函数

中的参数
  

##默认S3方法:

     

mean(x,trim = 0,na.rm = FALSE,...)

 f1 <- function(func,arg.names) { 
        lst <- mget(arg.names, envir = parent.frame())
        names(lst)[1] <- 'x'
         do.call(func, lst)
     }

f1(func, arg.names = c('foo', 'na.rm'))
#[1] 3

答案 1 :(得分:1)

?do.call的魔力在等着你:

do.call(func, list(foo, na.rm=na.rm))
#[1] 3

这基本上只是创建并运行:

func(foo, na.rm=na.rm)

... func的参数作为(可能命名的)列表传入。