如何使用参数列表 (tibbles) 进行函数调用
How to do a function call with a list of arguments (tibbles)
我正在尝试调用一个函数,使用包含两个小标题的列表作为参数。
我尝试了多种方法(pmap
、do.call
、invoke
、exec
),但 none 似乎有效。似乎不是使用两个 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
有什么简单的方法吗?我只是错过了什么吗?
简而言之:我想在列表中给出两个小标题,作为函数的参数。
如果您愿意冒险确保参数的顺序正确(或者无关紧要),
do.call(fun,unname(list1))
工作正常(当参数未命名时,R 使用参数的位置匹配)。
如果您想添加任意数量的 tibbles 列表的第一行,这会起作用:
sumfun <- function(...) { Reduce("+",
purrr::map(as.list(...),~.[1,]))}
sumfun(list1)
(可能有 "tidier" 方法)
@joran 发布:
如果 list1 的名称是 tbl1 和 tbl2 以匹配函数参数,do.call 工作正常。和 invoke
一样
你必须以某种方式告诉函数哪些列表元素与哪些参数一起使用,除非你唯一的参数是......这可能是你想要做的更好的方法?另一个(有点迂回)选项是通过使用 formalArgs()
获取参数名称来手动重命名列表元素
我正在尝试调用一个函数,使用包含两个小标题的列表作为参数。
我尝试了多种方法(pmap
、do.call
、invoke
、exec
),但 none 似乎有效。似乎不是使用两个 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
有什么简单的方法吗?我只是错过了什么吗?
简而言之:我想在列表中给出两个小标题,作为函数的参数。
如果您愿意冒险确保参数的顺序正确(或者无关紧要),
do.call(fun,unname(list1))
工作正常(当参数未命名时,R 使用参数的位置匹配)。
如果您想添加任意数量的 tibbles 列表的第一行,这会起作用:
sumfun <- function(...) { Reduce("+",
purrr::map(as.list(...),~.[1,]))}
sumfun(list1)
(可能有 "tidier" 方法)
@joran 发布:
如果 list1 的名称是 tbl1 和 tbl2 以匹配函数参数,do.call 工作正常。和 invoke
一样你必须以某种方式告诉函数哪些列表元素与哪些参数一起使用,除非你唯一的参数是......这可能是你想要做的更好的方法?另一个(有点迂回)选项是通过使用 formalArgs()
获取参数名称来手动重命名列表元素