purrr::pmap 具有用户定义的函数和命名列表

purrr::pmap with user-defined functions and named list

以下代码按预期工作:

library(tidyverse)
tib <- tibble(x = c(1,2), y = c(2,4), z = c(3,6)) 
tib %>% pmap(c)
#[[1]]
#x y z
#1 2 3
#
#[[2]]
#x y z
#2 4 6

但是如果我定义函数

my_c_1 <- function(u, v, w) c(u, v, w)

我收到一个错误:

tib %>% pmap(my_c_1)
#Error in .f(x = .l[[c(1L, i)]], y = .l[[c(2L, i)]], z = .l[[c(3L, i)]],  :
#  unused arguments (x = .l[[c(1, i)]], y = .l[[c(2, i)]], z = .l[[c(3, i)]])

等价地,对于具有基本向量函数的命名列表,一切都很好:

lili_1 <- list(x = list(1,2), y = list(2,4), z = list(3,6))
pmap(lili_1, c)
#[[1]]
#x y z
#1 2 3
#
#[[2]]
#x y z
#2 4 6

并且使用用户定义的函数我得到了同样的错误:

pmap(lili_1, my_c_1)
#Error in .f(x = .l[[c(1L, i)]], y = .l[[c(2L, i)]], z = .l[[c(3L, i)]],  :
#unused arguments (x = .l[[c(1, i)]], y = .l[[c(2, i)]], z = .l[[c(3, i)]])

但是,对于具有用户定义函数的未命名列表,它有效:

lili_2 <- list(list(1,2), list(2,4), list(3,6))
pmap(lili_2, my_c_1)
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 2 4 6

我不太明白为什么命名列表和用户定义函数会出错。有什么见解吗?

顺便说一句,我通过定义找到了一个临时解决方法:

my_c_2 <- function(...) c(...)

然后一切正常,即使使用命名列表...这让我更加困惑。
这是本着最小可重现示例的精神。在我当前的工作代码中,我希望能够使用我更通用的定义函数将 tibbles 传输到 pmap,而无需对我的变量使用 ... 解决方法。

你的函数 my_c_1 有参数 uvw 但你传递了一个名称为 xy 的列表, z。如果您不想要一个没有命名参数的函数(...,例如 base 的 c),您应该确保名称在您的调用中匹配。