我通常使用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创建
答案 0 :(得分:2)
正如@MrFlick所述,您正在函数环境中修改变量。这就是为什么您看不到预期结果的原因。
您可以尝试:
# map over dat and update object result
result <- pmap(dat, function(rowname, mpg, cyl, disp) {
paste(mpg, cyl, disp)
})
names(result) <- dat$rowname
或
result <- apply(dat, 1, function(x){
paste(x[2],x[3],x[4])
})
names(result) <- dat$rowname
在基本R中。
答案 1 :(得分:2)
如@MrFlick所述,您正在尝试为具有自己环境的函数中的result
分配一个值。
您可以使用<<-
赋值运算符在全局环境(函数外部)中修改result
,而只需更改代码即可。但是在使用它时要小心,不要修改您不打算使用的变量(甚至函数)。
从R文档(?`<<-`
)
运算符<<-和->>通常仅在函数中使用,并导致在父环境中搜索要分配的变量的现有定义。如果找到了这样的变量(并且其绑定未锁定),那么将重新定义其值,否则将在全局环境中进行赋值。
result <- list() # Defined in the global environment
pwalk(dat, function(rowname, mpg, cyl, disp) {
result[[rowname]] <<- paste(mpg, cyl, disp)
})
result
# Output
$`Mazda RX4`
[1] "21 6 160"
$`Mazda RX4 Wag`
[1] "21 6 160"
$`Datsun 710`
[1] "22.8 4 108"
})