построчная итерация с purrr не работает должным образом - PullRequest
0 голосов
/ 05 ноября 2019

Я обычно использую циклы for для перебора объектов. Недавно я наткнулся на функцию с именем pmap() из пакета purrr, которая предоставляет альтернативный способ параллельного отображения объекта.

Мой пример ниже не работает, и я не понимаю, почему. У кого-нибудь есть идея, почему список вывода 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()

Создан в 2019-11-05 пакетом Представление (v0.2.1)

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Как уже упоминалось @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"
})
2 голосов
/ 05 ноября 2019

Как уже упоминалось @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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...