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,
- O que a função
iwalk
está exatamente fazendo?
- Pq ele coloca
.x$carrier[[1]]
? Pq o [[1]]
?
- Nesse caso da função
iwalk
o que é o .x
e .y
? Principalmente o .x
?
-
{ }
é o curly-curly? Qual o papel dele ali?
- 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á:
-
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.
-
“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
).
-
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