【问题标题】:How to do a function call with a list of arguments (tibbles)如何使用参数列表(小标题)进行函数调用
【发布时间】:2019-08-30 21:18:16
【问题描述】:

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

我尝试了多种方法(pmapdo.callinvokeexec),但似乎都没有。似乎没有使用两个小标题,而是使用小标题的列表。

示例数据:

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

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

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

【问题讨论】:

  • 什么是magic_function_call()?那是您要填写pmap 或其他功能的地方吗?我认为您遇到了difference between [ and [[
  • @joran 非常感谢,这是我忽略的问题!您是否知道使用不匹配函数参数名称的 do.call(或任何其他方式)的方法
  • 是的,``` fun
  • 如果某个答案解决了您的问题,请点击旁边的勾号接受它;不要编辑问题。
  • 如果解决方案是您在 cmets 中给出的解决方案,那么您可以自己发布答案。

标签: r list nested-lists tibble function-call


【解决方案1】:

如果您愿意冒险确保论点的顺序正确(或者没关系),

do.call(fun,unname(list1))

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

如果您想添加任意数量的小标题列表的第一行,这将起作用:

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

(可能有一种“更整洁”的方式来做到这一点)

【讨论】:

    【解决方案2】:

    @joran 发布:

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

    您必须以某种方式告诉函数哪些列表元素与哪些参数一起使用,除非您唯一的参数是......这可能是您尝试做的更好的方法?另一个(某种迂回)选项是通过使用formalArgs() 获取参数名称来手动重命名列表元素

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      相关资源
      最近更新 更多