【发布时间】:2019-11-05 16:24:12
【问题描述】:
我通常使用 for 循环来迭代对象。我最近从purrr 包中偶然发现了一个名为pmap() 的函数,它提供了另一种并行映射对象的方法。
我下面的例子不起作用,我不明白为什么。有谁知道,为什么在迭代数据帧时输出列表result 没有得到更新? for 循环会产生所需的输出,但会以可读性为代价。
# load packages
library(tidyverse)
# create small dataset
dat <- mtcars[1:3, 1:3] %>%
rownames_to_column()
# view dat
dat
#> rowname mpg cyl disp
#> 1 Mazda RX4 21.0 6 160
#> 2 Mazda RX4 Wag 21.0 6 160
#> 3 Datsun 710 22.8 4 108
# prepare output list
result <- list()
# map over dat and update object result
pwalk(dat, function(rowname, mpg, cyl, disp) {
result[[rowname]] <- paste(mpg, cyl, disp)
})
# result did not get updated
result
#> list()
由reprex package (v0.2.1) 于 2019-11-05 创建
【问题讨论】:
-
您正在将一个函数传递给 pwalk 并修改该函数内的一个变量。您在函数内部修改的变量不存在于函数外部。
-
这样的东西可能是一个更好的 tidyverse 替代方案。
set_names(pmap(dat %>% select(-rowname), paste), dat$rowname)