Purrr, vroom e curly-curly

Olá, pessoal! Como vão?

Estava estudando o pacote vroom e eles dão esse exemplo de divisão de uma base de dados. No entanto, eu consigo ver que o resultado consiste na divisão da base de dados flights em arquivos divididos por companhia aérea. No entanto, eu não entendi a lógica do cógido. Por exemplo,

  1. O que a função iwalk está exatamente fazendo?
  2. Pq ele coloca .x$carrier[[1]]? Pq o [[1]]?
  3. Nesse caso da função iwalk o que é o .x e .y? Principalmente o .x?
  4. { } é o curly-curly? Qual o papel dele ali?
  5. Vocês escreveriam o código diferente? Sugestão?
library(nycflights13)

purrr::iwalk(
  .x = split(flights, flights$carrier),
  .f = ~ { .x$carrier[[1]]; vroom::vroom_write(.x, glue::glue("flights_{.y}.tsv"), delim = "\t") }
)

Como sempre, agradeço a ajuda!

Vamos lá. As suas dúvidas são relacionadas bastante com o tidyverse. Portanto vou direcionar você para conteúdos de lá:

  1. O que é o .x?: Veja no capítulo 21 do Livro R for Data science do Hadley. O .x é o primeiro argumento do iwalk que é uma lista ou outro container contíguo (e iterável) de R que o iwalk vai mapear a função .f para elemento deste container.

  2. “Por que o [[1]]?” Isso não está relacionado com tidyverse mas sim com a linguagem R. Toda lista pode ser subsetted com os operadores [, [[ ou $. Quando você faz lista[1] você retorna uma lista com um único elemento. Quando você faz lista[[2]] você retorna o elemento em sí. Então [1] retornará sempre uma lista e [[1]] retornará sempre o objeto indexado 1 da lista. Veja o capítulo 4 do Livro R for Data science do Hadley. O operador $ é um açúcar sintático para lista[[1]]. Então lista$1 == lista$1. Mas eu acredito que no purrr o melhor é usar [[ do que o $ (acredito que ele tenha alguns problemas com citações e expressões dentro de funções do purrr).

  3. O {...} é apenas um definidor de escopo. Ele apenas serve para agrupar as coisas. No caso específico ele serve para mostrar ao iwalk que o argumento .f é tudo isso que está entre { e }. Cuidado que algumas vezes o {...} não é usado como definidor de escopo (caso fique curiosa pesquise o curly-curly em vídeos ou blogs de R).

Agora a pergunta pessoal sobre como eu escreveria isso. Eu usaria o pacote {arrow} que mapeia a memória em disco (não usando RAM) para trabalhar com qualquer big data. Eu uso ele bastante quando tenho datasets que são maiores que a minha RAM. Veja a documentação e esse vídeo. Eu lembro o drama que era antes de {arrow} quando eu prototipava código com 5% dos dados, preparava tudo e subia uma máquina de 256GB RAM na AWS com um Dockerfile com RStudio server e rodava tudo em 30 minutos pagando U$ 2,50. Tem também o {disk.frame} que pode te ajudar, documentação e vídeo.

1 Curtida