遵循Hadley在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()
功能在我的个人包装中。
我已经测试了在给定两个参数的情况下我制作的匿名函数可以工作的情况。
但是,这将引发错误:
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),
...)
大概是因为第三个参数(a data.frame
)传递给条件条件,该条件无法求值为true或false并引发错误。
因此,如果我们不是给它list
的data.frames
,它应该工作:
merge_datasets_multi(list(iris[1:50, ], iris[51:100, ], iris[101:150, ]))
确实如此。但是,这需要用户采取额外的步骤将data.frames添加到中,list
然后再调用merge_datasets_multi()
。
我尝试将as.list(...)
用作参数传递给Reduce()
,但它不起作用。输出只是第一个data.frame
转换为的输出list
。
一个人如何做一个以Reduce()
它...
为输入的顺序函数?
答案显然很简单。与其尝试as.list()
,不如尝试使用list()
。请参阅此先前的答案。
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句