Write_csv dando erro fatal no R

Olá pessoal. Estou com um problema especificamente quando tento salvar um banco de dados com as populações dos municípios brasileiros entre 2002 e 2019. Após realizar uma categorização por porte da população através da função base::cut, e tentar salvar o arquivo em csv a partir da função readr::write_csv, o R apresenta um erro fatal. Eu criei um issue no GitHub do Readr https://github.com/tidyverse/readr/issues/1314

O banco de dados está lá poder ser reproduzido. É bem estranho isso. Estou quase reinstalando o R e vê se resolve.

Ps.: Ao usar write.csv, tudo funciona normalmente.

reprex::reprex({
setwd(“C:/Users/rafae/OneDrive/2021.2/Pesquisa/Artigos - Tese/Artigo 1 - RSP”)
pop_mun ← readr::read_csv(“data/pop_mun_2002_2019.csv”) |>
dplyr::mutate(porte_pop = factor(ifelse(pop <=5000, “Até 5000”,
ifelse(pop > 5000 & pop <= 10000, “De 5.001 até 10.000”,
ifelse(pop > 10000 & pop <= 20000, “De 10.001 até 20.000”,
ifelse(pop > 20000 & pop <= 50000, “De 20.001 até 50.000”,
ifelse(pop > 50000 & pop <= 100000, “De 50.001 até 100.000”,
ifelse(pop > 100000 & pop <= 500000, “De 100.001 até 500.000”,
ifelse(pop > 500000 , “Maior que 500.000”, NA))))))))) |>
tidyr::drop_na(porte_pop)

readr::write_csv(pop_mun, “data/teste.csv”)
}
,
std_out_err = TRUE)

Oi Rafael! Tudo bem?

O código que você escreveu não é um reprex real… É um código para gerar um reprex mas não é um resultado de um reprex.

Tem um video não tão estruturado que gravei uma vez sobre isso, se for útil:

Eu adaptei o código e aqui funcionou normalmente. Veja se funciona pra você também:

obs: eu alterei os vários ifelse para um único case_when(), assim o código fica mais limpo.

pop_mun <-
  readr::read_csv("https://github.com/tidyverse/readr/files/7314636/pop_mun_2002_2019.csv") |>
  dplyr::mutate(
    porte_pop = dplyr::case_when(pop <= 5000 ~ "Até 5000",
                                 pop > 5000 & pop <= 10000 ~ "De 5.001 até 10.000",
                                 pop > 10000 & pop <= 20000 ~ "De 10.001 até 20.000",
                                 pop > 20000 & pop <= 50000 ~ "De 20.001 até 50.000",
                                 pop > 50000 & pop <= 100000 ~ "De 50.001 até 100.000",
                                 pop > 100000 & pop <= 500000 ~ "De 100.001 até 500.000",
                                 pop > 500000 ~ "Maior que 500.000",
                                 TRUE ~ NA_character_
                                 )) |>
  tidyr::drop_na(porte_pop)
#> Rows: 100080 Columns: 3
#> ── Column specification ────────────────────────────────────────────────────────
#> Delimiter: ","
#> dbl (3): ibge, ano, pop
#> 
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.


# ver como a base ficou
dplyr::glimpse(pop_mun)
#> Rows: 100,080
#> Columns: 4
#> $ ibge      <dbl> 110001, 110001, 110001, 110001, 110001, 110001, 110001, 1100…
#> $ ano       <dbl> 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, …
#> $ pop       <dbl> 27237, 27563, 29001, 28629, 29005, 23857, 24577, 24354, 2442…
#> $ porte_pop <chr> "De 20.001 até 50.000", "De 20.001 até 50.000", "De 20.001 a…


# criar a pasta data/
fs::dir_create("data/")

# salvar em csv
readr::write_csv(pop_mun, "data/teste.csv")


# verificar se o arquivo existe
fs::file_exists("data/teste.csv")
#> data/teste.csv 
#>           TRUE


# importar o arquivo salvo
readr::read_csv("data/teste.csv") |>
  head()
#> Rows: 100080 Columns: 4
#> ── Column specification ────────────────────────────────────────────────────────
#> Delimiter: ","
#> chr (1): porte_pop
#> dbl (3): ibge, ano, pop
#> 
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#> # A tibble: 6 × 4
#>     ibge   ano   pop porte_pop           
#>    <dbl> <dbl> <dbl> <chr>               
#> 1 110001  2002 27237 De 20.001 até 50.000
#> 2 110001  2003 27563 De 20.001 até 50.000
#> 3 110001  2004 29001 De 20.001 até 50.000
#> 4 110001  2005 28629 De 20.001 até 50.000
#> 5 110001  2006 29005 De 20.001 até 50.000
#> 6 110001  2007 23857 De 20.001 até 50.000

Created on 2021-10-09 by the reprex package (v2.0.1)

Talvez o erro não seja no readr em si, mas em outras coisas. O seu readr está atualizado? Uma boa é ver o resultado do devtools::session_info() (e provavelmente os mantenedores do readr irão solicitar isso).

Bia, eu não consigo rodar o reprex já que o R “crasha”, ou seja, ele afirma que encontrou o um R fatal ao rodar o write_csv. Como ele não roda até o final, o reprex não finaliza e não informa possíveis erros. Foi por isso que eu tentei usar esta opção : std_out_err = TRUE já que na documentação do pacote reprex ele dá esta dica de uso para estes casos (ao menos foi assim que entendi).

Eu desinstalei o R e o Rstudio. Reinstalei novamente. Instalei o tidyverse e o devtools e suas dependências. Na imagem abaixo eu reproduzi exatamente o seu script e quando fui rodar o write_csv, ele deu este erro fatal. Estranho não?

x Install the styler package in order to use style = TRUE.
i Rendering reprex…
Error: This reprex appears to crash R
Call reprex() again with std_out_err = TRUE to get more info
Run rlang::last_error() to see where the error occurred.

rlang::last_error()
<error/rlang_error>
This reprex appears to crash R
Call reprex() again with std_out_err = TRUE to get more info
Backtrace:

  1. (function (venue = getOption(“reprex.venue”, “gh”)) …
  2. reprex::reprex(input = rstudio_selection(), venue = venue)
  3. reprex:::reprex_impl(…)
  4. reprex:::reprex_render_impl(…)
    Run rlang::last_trace() to see the full context.

Rafael, o problema pode ter diversas causas.

  1. Normalmente vemos a “bombinha” quando o R estoura o limite de memória do computador; pode ser que o {readr} esteja gastando mais memória do que o read.csv(). Quantos GB de RAM o seu computador tem?

  2. Qual é a saída do comando sessionInfo()? Talvez haja alguma incompatibilidade nas versões.

  3. Você tentou salvar uma amostra da tabela? Se houver algum problema com o tamanho do arquivo, isso pode nos ajudar. Talvez haja pouco espaço sobrando no disco, por exemplo.

  4. Os nomes das pastas me são suspeitos. Eu estou vendo uma pasta com . e algumas com espaços no nome, coisas que podem gerar problemas imprevisíveis com arquivos. Você tentou salvar o arquivo em outro diretório?

Por fim, minha sugestão pessoal é não criar issues em pacotes muito populares antes de identificar o problema. Os desenvolvedores normalmente são muito ocupados e as chances de você ser ignorado ou receber uma resposta grossa são altas. Infelizmente essa é uma realidade do mundo open source :confused:

1 Curtida

Olá Caio. Muito obrigado pela resposta. Meu computador é este:
image

Por via das dúvidas, eu tentei rodar o mesmo código em outro computador que tenho casa (atualizei ambos R e Rstudio e pacotes [tidyverse] para a versão mais atual). As especificações deste outro computador é:
Captura de tela 2021-10-10 072800

Segue o devtools::sessection_info()

devtools::session_info()
#> - Session info ---------------------------------------------------------------
#>  setting  value                       
#>  version  R version 4.1.1 (2021-08-10)
#>  os       Windows 10 x64              
#>  system   x86_64, mingw32             
#>  ui       RTerm                       
#>  language (EN)                        
#>  collate  Portuguese_Brazil.1252      
#>  ctype    Portuguese_Brazil.1252      
#>  tz       America/Sao_Paulo           
#>  date     2021-10-10                  
#> 
#> - Packages -------------------------------------------------------------------
#>  package     * version date       lib source        
#>  cachem        1.0.6   2021-08-19 [1] CRAN (R 4.1.1)
#>  callr         3.7.0   2021-04-20 [1] CRAN (R 4.1.1)
#>  cli           3.0.1   2021-07-17 [1] CRAN (R 4.1.1)
#>  crayon        1.4.1   2021-02-08 [1] CRAN (R 4.1.1)
#>  desc          1.4.0   2021-09-28 [1] CRAN (R 4.1.1)
#>  devtools      2.4.2   2021-06-07 [1] CRAN (R 4.1.1)
#>  digest        0.6.28  2021-09-23 [1] CRAN (R 4.1.1)
#>  ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.1.1)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.1.1)
#>  fastmap       1.1.0   2021-01-25 [1] CRAN (R 4.1.1)
#>  fs            1.5.0   2020-07-31 [1] CRAN (R 4.1.1)
#>  glue          1.4.2   2020-08-27 [1] CRAN (R 4.1.1)
#>  highr         0.9     2021-04-16 [1] CRAN (R 4.1.1)
#>  htmltools     0.5.2   2021-08-25 [1] CRAN (R 4.1.1)
#>  knitr         1.36    2021-09-29 [1] CRAN (R 4.1.1)
#>  lifecycle     1.0.1   2021-09-24 [1] CRAN (R 4.1.1)
#>  magrittr      2.0.1   2020-11-17 [1] CRAN (R 4.1.1)
#>  memoise       2.0.0   2021-01-26 [1] CRAN (R 4.1.1)
#>  pkgbuild      1.2.0   2020-12-15 [1] CRAN (R 4.1.1)
#>  pkgload       1.2.2   2021-09-11 [1] CRAN (R 4.1.1)
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.1.1)
#>  processx      3.5.2   2021-04-30 [1] CRAN (R 4.1.1)
#>  ps            1.6.0   2021-02-28 [1] CRAN (R 4.1.1)
#>  purrr         0.3.4   2020-04-17 [1] CRAN (R 4.1.1)
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.1.1)
#>  remotes       2.4.1   2021-09-29 [1] CRAN (R 4.1.1)
#>  reprex        2.0.1   2021-08-05 [1] CRAN (R 4.1.1)
#>  rlang         0.4.11  2021-04-30 [1] CRAN (R 4.1.1)
#>  rmarkdown     2.11    2021-09-14 [1] CRAN (R 4.1.1)
#>  rprojroot     2.0.2   2020-11-15 [1] CRAN (R 4.1.1)
#>  rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.1.1)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.1.1)
#>  stringi       1.7.5   2021-10-04 [1] CRAN (R 4.1.1)
#>  stringr       1.4.0   2019-02-10 [1] CRAN (R 4.1.1)
#>  testthat      3.1.0   2021-10-04 [1] CRAN (R 4.1.1)
#>  usethis       2.0.1   2021-02-10 [1] CRAN (R 4.1.1)
#>  withr         2.4.2   2021-04-18 [1] CRAN (R 4.1.1)
#>  xfun          0.26    2021-09-14 [1] CRAN (R 4.1.1)
#>  yaml          2.2.1   2020-02-01 [1] CRAN (R 4.1.1)
#> 
#> [1] C:/Users/rafae/OneDrive/Documentos/R/win-library/4.1
#> [2] C:/Program Files/R/R-4.1.1/library

Created on 2021-10-10 by the reprex package (v2.0.1)

O que eu percebi, tentando resolver foi que o problema ocorre após eu criar uma variável com o porte populacional dos municípios brasileiros. O problema ocorre seja usando a função cut ou case_when (seguindo a sugestão da Bia). É estranho ocorrer em dois computadores diferentes.

Continuando os testes, o problema não ocorre quando eu diminuo o banco de dados para 5 mil ou 10 mil linhas. 15 mil linhas ele já “crasha” o R. Será que é problema de memória ram? Estranho o utils::write.csv não dá o mesmo o problema.

Só reportando que o issue que abri no readr foi respondido por outra pessoa afirmando o mesmo problema. Ela sintetizou em um código simples que eu repliquei e comentei lá que está acontecendo com palavras acentuadas também.

NO caso dele, ele simplesmente adicionou um banco com mais de 20.000 linhas com uma palavras em chinês e o write_csv “crashava” o R. EU fiz o teste com uma palavras acentuada e percebi o mesmo efeito.

setwd("C:/Users/rafae/OneDrive/2021.2/Pesquisa/Artigos - Tese/Artigo 1 - RSP")
df <- tibble::tibble(a = 1:20000, 
                     b = "ate")
readr::write_csv(df,"data/teste.csv")

Created on 2021-10-11 by the reprex package (v2.0.1)

Interessantíssimo! O problema é do {readr} mesmo, então você pode ficar tranquilo e aguardar a solução da issue. Talvez eles peçam um exemplo reprodutível que não seja um print (como é o caso do segundo comentário), mas de fato parece algo que múltiplas pessoas estão reportando. Agora que o problema foi identificado fica mais fácil para eles tentarem ajudar.