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
内部起作用,因为变量 a
和 b
在范围内可见。也就是说,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
with
和 within
都不是 tidyverse
函数,尽管它们有时会提供一些更易于阅读的代码。
sim %>% pmap_dbl(add_2)
等效于 pmap_dbl(sim, add_2)
,因为 pmap*
函数的第一个参数是 list
,并且 sim
是tibble
,它继承了 data.frame
,它只是一个 list
,其中元素是等长的向量(或 list
s)。你的调用等同于 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)
哪个有效。
我有这个矩阵,我想使用 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
内部起作用,因为变量 a
和 b
在范围内可见。也就是说,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
with
和 within
都不是 tidyverse
函数,尽管它们有时会提供一些更易于阅读的代码。
sim %>% pmap_dbl(add_2)
等效于 pmap_dbl(sim, add_2)
,因为 pmap*
函数的第一个参数是 list
,并且 sim
是tibble
,它继承了 data.frame
,它只是一个 list
,其中元素是等长的向量(或 list
s)。你的调用等同于 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)
哪个有效。