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
有参数 u
、v
、w
但你传递了一个名称为 x
、y
的列表, z
。如果您不想要一个没有命名参数的函数(...
,例如 base 的 c
),您应该确保名称在您的调用中匹配。
以下代码按预期工作:
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
),您应该确保名称在您的调用中匹配。