r语言 - 如何使用参数列表(tibbles)进行函数调用



我正在尝试调用一个函数,使用包含两个 tibble 的列表作为参数。

我尝试了多种方法(pmapdo.callinvokeexec(,但似乎没有一种有效。似乎没有使用两个 tibbles,而是使用了 tibbles 的列表。

示例数据:

list1 <- list(test1 = tibble(a = 1:3, b = 4:6), 
test2 = tibble(c = 5:7, d = 7:9))
fun <- function(tbl1,tbl2) tbl1[1,] + tbl2[1,]

我想得到的是:

print(magic_function_call(fun, list1))
> 6 11

在没有函数的情况下硬编码,它将是这样的:

list1$test1[1,] + list1$test2[1,]

我得到的是:

pmap(list1,fun)
> Error in .f(test1 = .l[[1L]][[i]], test2 = .l[[2L]][[i]], ...) : 
unused arguments (test1 = .l[[1]][[i]], test2 = .l[[2]][[i]])
do.call(fun,list1)
> Error in (function (tbl1, tbl2)  : 
unused arguments (test1 = list(1:3, 4:6), test2 = list(5:7, 7:9))
invoke(fun, list1)
> Error in (function (tbl1, tbl2)  : 
unused arguments (test1 = list(1:3, 4:6), test2 = list(5:7, 7:9))
exec(fun, !!!list1)
> Error in (function (tbl1, tbl2)  : 
unused arguments (test1 = list(1:3, 4:6), test2 = list(5:7, 7:9))

手工完成是有效的,但感觉有点笨拙,一旦我想使用不同大小的动态列表,我就会再次遇到问题。

fun(list1$test1, list1$test2)
> 6 11

有什么简单的方法可以做到这一点吗?我只是错过了什么吗?

所以简而言之:我想在一个列表中给出两个 tibbles,作为函数的参数。

如果你愿意冒险,参数的顺序是正确的(或者如果没关系(,

do.call(fun,unname(list1))

工作正常(当参数未命名时,R 对参数使用位置匹配(。

如果要添加任意数量的 tibble 列表的第一行,这将起作用:

sumfun <- function(...) { Reduce("+",
purrr::map(as.list(...),~.[1,]))}
sumfun(list1)

(可能有"更整洁"的方法可以做到这一点(

正如@joran发布的那样:

如果 list1 的名称是 tbl1 和 tbl2 以匹配函数参数,则 do.call 工作正常。调用也是如此

你必须以某种方式告诉函数哪些列表元素与哪些参数一起使用,除非你唯一的参数是......对于您要做的事情,哪种方法可能更好?另一个(有点环形交叉路口(选项是通过使用 formalArgs(( 抓取参数名称来手动重命名列表元素

最新更新