map2_dbl() 单独抛出错误,但不与 dplyr::mutate() 结合使用

map2_dbl() throws an error while alone, but not in combination with dplyr::mutate()

我有这个矩阵,我想使用 purrr::map2_dbl() 在每一行上执行一个函数 - 让我们说添加 - 现在,以下工作:

add_2 <- function(a, b) a + b

sim <- tibble(
    a = 1:4,
    b = 5:8
)

sim %>% mutate(sum = map2_dbl(a, b, add_2))

但是,当我单独使用 map2_dbl() 时,它会抛出一个错误:

sim %>% map2_dbl(a, b, add_2)
Error in as_function(.f, ...) : object 'b' not found

我不明白为什么;另外,有趣的是 pmap_dbl() 工作得很好。

sim %>% pmap_dbl(add_2) # 6, 8, 10, 12

感谢您的帮助。

问题是第一个在 mutate 内部起作用,因为变量 ab 在范围内可见。也就是说,mutate 使 sim$a 可用作其他列的 a,等等。这是 mutate 的函数,而不是 %>% 管道。

sim %>% map2_dbl(a, b, add_2) 的字面等价物是 map2_dbl(sim, a, b, add_2),我希望它现在可以澄清为什么该形式不起作用。正如@akrun 的评论所提供的,您需要前两个参数映射到两个向量。

也许您更喜欢:

with(sim, map2_dbl(a, b, add_2))
# [1]  6  8 10 12

within(sim, { mysum = map2_dbl(a, b, add_2) })
# # A tibble: 4 × 4
#       a     b   sum mysum
#   <int> <int> <dbl> <dbl>
# 1     1     5     6     6
# 2     2     6     8     8
# 3     3     7    10    10
# 4     4     8    12    12

withwithin 都不是 tidyverse 函数,尽管它们有时会提供一些更易于阅读的代码。

sim %>% pmap_dbl(add_2) 等效于 pmap_dbl(sim, add_2),因为 pmap* 函数的第一个参数是 list,并且 simtibble,它继承了 data.frame,它只是一个 list,其中元素是等长的向量(或 lists)。你的调用等同于 pmap_dbl(list(sim$a, sim$b), add_2)(冗长和矫枉过正,当然)。

因为管道

sim %>% 
    map2_dbl(a, b, add_2)

转换为:

map2_dbl(.x = sim, .y = a, .f = b, ... = add_2)

这没有意义,实际上错误警告 b 不存在。


同样

sim %>% 
    pmap_dbl(add_2)

转换为:

pmap_dbl(.l = sim, .f = add_2)

哪个有效。