以下代码按预期工作:
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
我不太明白为什么事情会破坏命名列表和用户定义的函数。有什么见解吗?
BTW,我通过定义:
找到了一个临时解决方法my_c_2 <- function(...) c(...)
然后一切运作良好,即使是有名单......这让我更加困惑
这是一个可重复性最小的例子。在我目前的工作代码中,我希望能够使用我更常规定义的函数将tibbles传递给pmap,而不使用我的变量的...
变通方法。
答案 0 :(得分:2)
您的函数my_c_1
包含参数u
,v
,w
,但您传递的名称为x
,y
,{{ 1}}。如果您不想要一个没有命名参数的函数(z
,例如基数...
),您应该确保在您的通话中名称匹配。