在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()
作为输入来生成具有...
的顺序函数?
答案 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