使用purrr进行逐行迭代无法按预期工作

时间:2019-11-05 16:24:12

标签: r iteration purrr

我通常使用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创建

2 个答案:

答案 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"
})