实现用户定义的do.call的正确功能的正确方法是什么?

时间:2019-12-30 18:36:22

标签: r do.call

我有一个do.call用例(由于调用了mclapply),简化为以下内容:

myfunc <- function(x, y) {
  str(x)
  #return(x + y)
} 

res <- list(list(x=1,y=1),list(x=2,y=2),list(x=3,y=3))
str(res)

do.call(what="myfunc", res)

无论我在myfunc中做什么,都行不通。我希望do.call会打三遍myfunc并传递响应。 x和y,但是它一次对所有数据调用一次,并抱怨它不知道如何处理其余参数...实现what函数的正确方法是什么,这样将对每个参数应用一些内容像其他基本功能一样列出元素?

更新使我对使用do.call感到困惑的是,我总是看到它用于“减少”集合的结果。我没有意识到的是do.call所调用的函数确实处理列表类型并减少了场景,例如rbind

2 个答案:

答案 0 :(得分:4)

lapply处理循环,do.call将列表元素用作参数。试试这个:

lapply(res, function(l) do.call('myfunc', l))

答案 1 :(得分:1)

tidyverse中,walk + reduce可以使用

library(purrr)
walk(res, reduce, myfunc)
#num 1
#num 2
#num 3