R: purrr: Оплата%.% Er: Ходит ли обход всего конвейерного вектора, а не элементов? - PullRequest
0 голосов
/ 10 февраля 2019

Вот функция, которая берёт имя файла stem, собирает имя файла из path, stem и суффикса, читает файл, удаляет переменную и снова сохраняет файл.В этой упрощенной версии основа чтения и сохраняемая единица совпадают, и я удаляю только одну переменную.

library(tidyverse)

strip_cps <-  function(X, path = path){
  readRDS(paste0(path = path, X, ".RDS")) %>%
    select(-"YEAR")  %>%
    saveRDS(file = paste0(path = path, X, ".RDS"))
}

Здесь приведена функция для многократного вызова предыдущей функции, один раз для каждого ствола.

compact_cps <- function(stems, path){
  stems %>% 
    walk(strip_cps0(., path=path))
}

Вот микроскопическая версия моих данных.Замените каталог данных на каталог в вашей собственной системе

df1 <- tibble(YEAR = 1, SEX = 1)
df2 = df1[1,] + c(1, 1)

saveRDS(df1, file = paste0("./CPS_1962-2018/", "df1", ".RDS"))
saveRDS(df2, file = paste0("./CPS_1962-2018/", "df2", ".RDS"))

Запуск вышеприведенного кода на этих данных выдает мне следующую ошибку:

Error in gzfile(file, "rb") : invalid 'description' argument

Из трассировки я узнаю, что gzfile называется readRDS.Перезапуская код с помощью debug, я узнаю, что аргумент описания gzfile - это

chr{1:2]  "./CPS_1962-2018/df1.RDS"   "./CPS_1962-2018/df1.RDS"

, то есть вектор символов длины 2.

Теперь, похоже,характеристика ошибок в моем коде, что я не могу решить себя, что они не там, где я думаю, что они есть.Но мне кажется, что прогулка, получив символьный вектор stems = c(“df1”, ”df2”) в качестве основного аргумента через %>% от вызывающей функции compact_cps, затем передает весь вектор в strip_cps вместо того, чтобы передавать его по одному элементу за раз,

Кажется более вероятным, что я что-то упустил, чем это сделала бы прогулка, но я не вижу, что.

1 Ответ

0 голосов
/ 10 февраля 2019

попробуйте это

compact_cps <- function(stems, path){
  stems %>% 
    walk(strip_cps, path=path))
}


первым аргументом для обхода является векторное основание, следующим аргументом является имя функции, которую вы хотите вызвать для каждого элемента в векторе, затем любые дополнительные аргументы дляфункция.

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