проблемы с мурлыканьем при использовании обхода с сохранением()

#r #save #purrr

#r #Сохранить #мурлыканье

Вопрос:

Я ищу помощи при использовании функции purrr::walk с сохранением.

У меня есть список из четырех dfs, которые я хочу записать в четыре отдельных файла. Это код, который я использовал, и ошибка, которую я получил. Оба .x и … это списки одинаковой длины. Я уверен, что допускаю какую-то простую ошибку, но не уверен, что это такое. Спасибо за помощь.

 # load libs
library(purrr)

# create dfs to loop over
df <- data.frame(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)
obj <- list(df1 = df, df2 = df, df3 = df, df4 = df )


# create file names to loop over
path <- "/user/home/"
folder <- "RDa/"
names <- c("df1", "df2", "df3", "df4")
fnames <- lapply(names, function(x) paste0(path, folder, x, ".RDa"))

# iterate
walk(obj, save, fnames)

Error in .f(.x[[i]], ...) : object ‘.x[[i]]’ not found
  

Информация о сеансе

 > sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
Running under: OS X 10.7.5 (Lion)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] purrr_0.2.2

loaded via a namespace (and not attached):
[1] magrittr_1.5 tools_3.2.1  Rcpp_0.12.3  knitr_1.12.3
  

Ответ №1:

Один из способов сделать это — использовать walk2 и передать fnames в качестве второго параметра ( .y ) функции (используя ~ для определения функции). Поэтому замените вашу последнюю строку на:

 walk2(obj, fnames, ~ save(.x, file = .y))
  

Ответ №2:

Функции imap , iwalk и т.д. были добавлены в purrr версию 0.2.3 в 2017 году. Они принимают список, но допускают как элементы списка (с сокращением .x ), так и имена (с сокращением .y ) для итерации.

Итак, в этом примере вы могли бы создавать имена файлов «на лету», например:

 iwalk(obj, function(o, name) {
  save(o, paste0(path, folder, name, ".RDa"))
})
  

Или с сокращениями:

 iwalk(obj, ~save(.x, paste0(path, folder, .y, ".RDa")))
  

Ответ №3:

 iwalk(~ write_csv(.x, file.path("folder_name", paste0(.y, ".csv"))))
  

Комментарии:

1. Это не будет работать так, как написано, поскольку вы ничего не просматривали. Вам не хватает первого аргумента