将任意参数传递给R中的多个嵌套函数

时间:2014-10-12 21:33:55

标签: r function nested arguments

无法找到类似于我想要做的问题。我有一个主力函数可以采用任何一类定制的子函数及其各自的参数,并对其进行某些处理,如下面的玩具示例:

func1 <- function(a, b, c) {a + b * c}

func2 <- function(x, y, z, bob, bleb) {(x / y)^bleb * z/bob}

workhorse <- function(m, n, o, FUN, ...) {
  result <- FUN(x, y, ...)
  [process result with m, n, and o]
}

就其本身而言,这非常有效,如

foo <- workhorse(m, n, o, func1, a, b, c)
foo2 <- workhorse(m, n, o, func2, x, y, z, bob, bleb)

我正在尝试为workhorse(meta_workhorse)创建一个包装器,它将接受一个函数列表(通过引用名称)来运行workhorse并组合结果,如下所示。

FUN_list <- c('func1', 'func2')
ARGS_list <- list(c(a, b, c), c(x, y, z, bob, bleb))

meta_workhorse <- function(mm, nn, oo, FUN_list, ARGS_list) {
  meta_result <- sapply(1:length(FUN_list), function(x) {
    workhorse(mm, nn, oo, get(FUN_list[x]), ARGS_list[x], ...)
  }
}

问题是每个子函数都有不同的参数,所以我需要将进入get()函数的函数名与ARGS_list中相应的参数列表链接起来。我已经尝试了我能想到的一切,包括do.calls,设置正式(主力),无济于事。在这种情况下如何传递参数?

编辑:Nicola的答案解决了大部分问题,但仍然有一个subfuction(使用打包函数)不断给出错误&#34;未使用的参数... = list(x,y)&# 34 ;.在我挖掘以前的省略号问题时寻找一些建议。

1 个答案:

答案 0 :(得分:3)

我猜你应该将你的ARGS_list声明为列表列表,而不是普通列表。然后,您可以继续使用do.call。一个例子(希望这就是你要找的):

   func1 <- function(a, b, c) {a + b * c}
   func2 <- function(x, y, z, bob, bleb) {(x / y)^bleb * z/bob}
   workhorse <- function(m, n, o, FUN, ...) {
     result <- FUN(...)
     result+m+n*o
   }
   FUN_list <- c('func1', 'func2')    
   ARGS_list <- list(list(a=1, b=2, c=3), list(x=4, y=5, z=6, bob=7, bleb=8))
   meta_workhorse <- function(mm, nn, oo, FUN_list, ARGS_list) {
      sapply(1:length(FUN_list), function(x) {
        do.call(workhorse,c(list(m=mm,n=nn,o=oo,FUN=get(FUN_list[x])),ARGS_list[[x]]))
      })
   }

   meta_workhorse(1,2,3,FUN_list,ARGS_list)
   # [1] 14.000000  7.143805