Ошибка при отображении функции / работает нормально, когда я запускаю ее вручную по частям; Почему? - PullRequest
0 голосов
/ 01 апреля 2020

Я прошу прощения за размер кода в этом вопросе, но, поскольку я не смог определить, где он идет не так, я решил предоставить его как можно ближе к оригиналу.

У меня есть следующая среда с двумя функциями:

Первая функция должна принимать в качестве входных данных серию путей для чтения файлов .csv (EMPRESA_reads), связывать их и экспортировать:

library(dplyr)
library(purrr)
library(glue)
library(data.table)

read_compile = function(EMPRESA_reads,Export_path){

  cat("Reading EMPRESA files... \n")
  EMPRESA_Imported = map(EMPRESA_reads,fread,sep = ",")

  cat("Binding EMPRESA rows... \n")
  EMPRESA_Imported = EMPRESA_Imported%>%
    lapply(., mutate_if, is.integer, as.character)%>%
    bind_rows()

  cat("Exporting file... \n")
  setwd(Export_path)
  fwrite(EMPRESA_Imported,file = "EMPRESA_compiled.csv",sep = ";")

  cat("Done! \n")
}

Вторая функция должна принимать в качестве входных данных строку идентификатора (RFB_date), генерировать правильные пути для ввода в первой функции, а затем вызывать ее:

Merge_by_date = function(RFB_date){

  cat(glue("Starting RFB_date {RFB_date}"))
  cat("\n")

  EMPRESA_path = glue("path/RFB_Empresas_{RFB_date}")
  Export_path = glue("path/RFB_Socios_{RFB_date}/With_EMPRESA_info")

  # Creating list of files to be read in each folder
  # Check the file name pattern and adjust accordingly

  EMPRESA_files = list.files(path = EMPRESA_path, pattern = "^empresas")
  EMPRESA_reads = glue("{EMPRESA_path}/{EMPRESA_files}")

  read_compile(EMPRESA_reads,Export_path)
}

Я хочу запустить эту вторую функцию для несколько дат, поэтому я сопоставляю их:

RFB_dates = c("201902",
              "201906",
              "201911",
              "202002")

map(RFB_dates,Merge_by_date)

При первом запуске (для RFB_dates[1]), однако, я получаю такой вывод:

Starting RFB_date 201902
Reading EMPRESA files... 
Binding EMPRESA rows... 

 Error in bind_rows_(x, .id) : 
  STRING_ELT() can only be applied to a 'character vector', not a 'char' 

Что указывает на некоторую проблему при связывании элементы списка EMPRESA_Imported в этом прогоне, но не раньше.

Дело в том, что при ручном запуске функции один раз (вместо ее отображения) она не выдает эту ошибку , выполняя bind_rows() как шо uld

Я не понял, почему это произошло, и благодарен за любую помощь!

О файлах .csv, которые я читаю: они довольно большие (всего ~ 15 ГБ) ), но не содержат ничего необычного: просто столбцы со строкой и цифрами c data.

Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2020

Попробуйте:

read_compile <- function(EMPRESA_reads,Export_path){

cat("Reading EMPRESA files... \n")
EMPRESA_Imported = map(EMPRESA_reads, ~ fread(.x, sep = ","))

cat("Binding EMPRESA rows... \n")
EMPRESA_Imported <- EMPRESA_Imported %>%
map(~ mutate_if(.x, is.integer(), as.character())) %>%
bind_rows()

cat("Exporting file... \n")
setwd(Export_path)
fwrite(EMPRESA_Imported,file = "EMPRESA_compiled.csv",sep = ";")

 cat("Done! \n")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...