以下代码按预期工作:
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
有参数u
,v
,w
,但你传递了一个带有名称的列表x
,y
,z
。如果您不想要没有命名参数的函数(...
,例如 base 的 c
),则应确保调用中的名称匹配。
关于r - 具有用户定义函数和命名列表的 purrr::pmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45541160/