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

标签 r tidyverse purrr

以下代码按预期工作:

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,但你传递了一个带有名称的列表xyz。如果您不想要没有命名参数的函数(...,例如 base 的 c),则应确保调用中的名称匹配。

关于r - 具有用户定义函数和命名列表的 purrr::pmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45541160/

相关文章:

r - 使用 `accumulate` 将列表中的数据帧反连接到原始先前的数据帧

r - 调整 font.lab 以在 plotmath 表达式中加粗?

optimization - 将巨大的矢量发送到 R 中的数据库

r - 如何使用ggplot2在甘特图中有条件地加粗y轴文本

r - R 中因子值的比例

删除空列表列

r - 如何使用自由刻度但在ggplot中保留固定引用点?

r - sf sfc 对象的坐标转换似乎不起作用

r - 在 mutate 中添加变量标签

r - 在现有行之间添加具有特定值的行