Reduce()和...(省略号)

时间:2015-11-26 21:01:49

标签: r functional-programming ellipsis

Hadley's advice in Advanced R之后,我尝试使用Reduce()创建合并函数的递归版本。然而,他的例子使用数字向量,例如

Reduce(`+`, 1:3)
[1] 6

而我希望能够使用...(省略号)给出多个参数。我的想法是这样的:

merge_datasets_multi = function(..., main=1, time=F) {
  #wrap with Reduce
  Reduce(function(x, y) merge_datasets(x, y, main=main, time=time), ...)

  #debugging, verify that the anonymous function works
  #(function(x, y) merge_datasets(x, y, main=main, time=time))(iris[1:50, ], iris[51:100, ])
}

merge_datasets()功能位于my personal package

我已经测试过,当给出两个参数时,我使用的匿名函数可以工作。

但是,这会引发错误:

merge_datasets_multi(iris[1:50, ], iris[51:100, ], iris[101:150, ])
Error in if (right) { : argument is not interpretable as logical
In addition: Warning message:
In if (right) { :
  the condition has length > 1 and only the first element will be used
Called from: Reduce(function(x, y) merge_datasets(x, y, main = main, time = time), 
    ...)

大概这是因为第三个参数(一个data.frame)被传递给一个条件,它无法计算为true或false并抛出错误。

因此,如果我们改为list data.frames,它应该有效:

merge_datasets_multi(list(iris[1:50, ], iris[51:100, ], iris[101:150, ]))

确实如此。但是,这需要额外的步骤,以便用户在调用list之前将data.frames添加到merge_datasets_multi()

我尝试将as.list(...)作为参数传递给Reduce(),但它不起作用。输出只是第一个data.frame转换为list

如何使用Reduce()作为输入来生成具有...的顺序函数?

1 个答案:

答案 0 :(得分:0)

答案显然很简单。不应尝试as.list(),而应使用list()。请参阅this previous answer

library(magrittr)
merge_datasets_multi = function(..., main=1, time=F) {
  #wrap with Reduce
  Reduce(function(x, y) merge_datasets(x, y, main=main, time=time), list(...))
}
merge_datasets_multi(iris[1:50, ], iris[51:100, ], iris[101:150, ]) %>% dim
[1] 150   5