Зацикливание на фрейме данных и сохранение фрагментов в rds приводит к NA.rds для fileneame - PullRequest
0 голосов
/ 12 ноября 2018
library(foreach)
targets = names(mtcars)
testing <- foreach(i = targets) %do% {
  x <- mtcars[i]
  saveRDS(x, file = paste0(targets[i], ".rds"))
  return(1) # hack to make loop not store in memory
}

Если вы запустите этот код, появится новый файл NA.rds, тогда как я ожидал, что length(targets) (11) появятся новые файлы rds с именами, такими как «mpg.rds», «cyl.rds» и т. Д. Однако я м осталось с одним файлом RDS NA.rds.

Как я могу перебрать фрейм данных и сохранить каждый фрагмент цикла в rds, где имя файла rds - это имя сохраняемого поля?

1 Ответ

0 голосов
/ 12 ноября 2018

Потому что вместо i (т.е. "mpg") вы используете targets["mpg"], что имеет смысл только тогда, когда ваш targets является вектором с names(targets) == targets. Итак, используя ваш пример:

library(foreach)
targets = names(mtcars)
targets
# [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

testing <- foreach(i = targets) %do% {
  message(sprintf("[+] i = %s", i))
  x <- mtcars[i]
  message(sprintf("[!] But targets[i] is %s!", targets[i]))
  message(sprintf("[*] Using paste0(i, '.rds'), produces: \n%s", paste0(i, ".rds")))
  #saveRDS(x, file = paste0(i, ".rds"))
  return(1) # hack to make loop not store in memory
}

# [+] i = mpg
# [!] But targets[i] is NA!
# [*] Using paste0(i, '.rds'), produces: 
# mpg.rds
# [+] i = cyl
# [!] But targets[i] is NA!
# [*] Using paste0(i, '.rds'), produces: 
# cyl.rds
# .....................................
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...