logrittr: Un operator de conducte profund pentru înregistrarea conductelor dplyr

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe Guillaume Pressiatși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)


Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.

Verbele dplyr sunt descriptive: să le facem mai verbose!

Încă o țeavă pentru R.

Repostează pentru o mai bună gestionare a imaginii pe bloggerii r.

Motivația

În SAS, fiecare pas DATA tipărește un jurnal:

NOTE: There were 120000 observations read from WORK.SALES.
NOTE: 7153 observations were deleted.
NOTE: The data set WORK.RESULT has 112847 observations and 11 variables.

R dplyr conductele sunt tăcute. logrittr umple acel gol cu %>=%o conductă introdusă care înregistrează numărul rândurilor, numărul coloanelor, coloanele adăugate/eliminate și sincronizarea la fiecare pas, fără mascarea funcției.

Cu ligaturi Fira Code, %>=% redă ca o singură săgeată largă similară vizual cu %>% cu o subliniere adăugată, ca un subtitlu sau, să zicem, pentru a citi între rândurile unei conducte (ce s-a întâmplat).

Contexte multiple

Lucrurile se întâmplă:

NOTE: There were 120000 observations read from WORK.SALES.
NOTE: 120000 observations were deleted.
NOTE: The data set WORK.RESULT has 0 observations and 11 variables.

„Aici am pierdut toate rândurile în execuția scriptului”.

Pro

Citirea acestui lucru mult timp după executarea unui script vă ajută să vedeți:

  • ce s-a întâmplat în fiecare etapă a procesării datelor fără a fi nevoie să rulați din nou codul, de exemplu într-un mediu de producție în care datele de intrare se schimbă constant
  • monitorizează procesele cheie
  • Asigurați-vă că puteți explica ce sa întâmplat (un audit, de exemplu)

În contexte profesionale este adesea nevoie.

Educativ

Acest lucru va fi, de asemenea, mai clar datorită unui jurnal de consolă pentru cei cu puțină experiență cu tidyverse: oameni care fac primii pași în programare urmând un tutorial sau predându-se singuri.

Instalare

install.packages('logrittr', repos="https://guillaumepressiat.r-universe.dev")

# or from github
# devtools::install_github("GuillaumePressiat/logrittr")

Vedeți github sau r-universe.

Utilizare

library(logrittr)
library(dplyr)

iris %>=%
  as_tibble() %>=%
  filter(Sepal.Length < 5)  %>=%
  mutate(rn = row_number()) %>=%
  semi_join(
    iris %>% as_tibble() %>=%
      filter(Species == "setosa"),
    by = "Species"
  )  %>=%
  group_by(Species) %>=%
  summarise(n = n_distinct(rn))
── iris  (rows:       150  cols:    5) ─────────────────────────────────────────────────────
ℹ as_tibble()                            rows:       150 +0        cols:    5 +0    (   0.0 ms)
ℹ filter(Sepal.Length < 5)               rows:        22 -128      cols:    5 +0    (   3.0 ms)
ℹ mutate(rn = row_number())              rows:        22 +0        cols:    6 +1    (   1.0 ms)
  added: rn
ℹ > filter(Species == "setosa")          rows:        50 -100      cols:    5 +0    (   1.0 ms)
ℹ semi_join(iris %>% as_tibble() %>=%    rows:        20 -2        cols:    6 +0    (   5.0 ms)
  filter(Species == "setosa"), by =
  "Species")
ℹ group_by(Species)                      rows:        20 +0        cols:    6 +0    (   3.0 ms)
ℹ summarise(n = n_distinct(rn))          rows:         1 -19       cols:    2 -4    (   2.0 ms)
  dropped: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, rn
  added: n

Captură de ecran

library(dplyr)
library(logrittr)

logrittr_options(lang = "en", big_mark = ",", wrap_width = NULL, max_cols = 3)

nycflights13::flights %>=% 
  as_tibble() %>=%
  group_by(year, month, day) %>=% 
  count() %>=% 
  tidyr::pivot_wider(values_from = "n", names_from = "day") %>=% 
  glimpse()

tidylog este un pachet cu adevărat îngrijit care îmi dă motivație pentru acesta.
tidylog funcționează prin mascarea funcțiilor dplyr, ceea ce nu mi se pare ideal.

Oricum, acesta a fost și un moment pentru mine să testez un nou instrument de programare care este folosit foarte mult pentru programare în acest moment.

logrittr folosește un operator de conducte personalizat și nu atinge niciodată spațiul de nume dplyr. Ieșirea sa din consolă este colorată și informativă datorită pachetului cli.

Lucrul cu lumberjack

Dacă cunoașteți deja pachetul de lumberjack, compatibilitatea este disponibilă cu logrittr (timpul sunt aproximativi).

Apel logrittr_logger$new():

library(lumberjack)
library(dplyr)

l <- logrittr_logger$new(verbose = TRUE)
logfile <- tempfile(fileext=".-r.log.csv")

iris %L>%
   start_log(log = l, label = "iris step") %L>%
   as_tibble() %L>%
   filter(Sepal.Length < 5) %L>%
   mutate(rn = row_number()) %L>%
   group_by(Species) %L>%
   summarise(n = n_distinct(rn)) %L>%
   dump_log(file=logfile, stop = FALSE)
   

mtcars %>% 
  start_log(log = l, label = "mtcars step") %L>%
   count() %L>%
   dump_log(file=logfile, stop = TRUE)


logdata <- read.csv(logfile)

Va scrie conținutul logrittr al mai multor pași de date în același fișier csv.

Limitări

  • Ca tidyloglogrittr funcționează doar cu conductele dplyr pe R data.frames (în memorie) și nu poate face acest lucru cu conductele dbplyr din baze de date (tabel la distanță/lazy).

  • Cardinalitățile de îmbinare bine făcute în tidylog sunt greu de obținut din conductă, deoarece îmbinarea este deja făcută, în acest moment arătăm doar evoluția N rând și N col (înainte/după).

  • Da, este o altă țeavă, nu ideală. Putem visa la o with_logging(TRUE) context care va activa comportamentul logrittr pipe în |> sau în %>%.

Luați o altă țeavă pentru o învârtire

logrittr prioritizează experiența utilizatorului cu un afișaj structurat și colorat în consolă.

Deocamdată, acest pachet este doar o dovadă a conceptului care mi-a dat șansa de a experimenta puțin cu cli pachet și alte câteva lucruri. Dar cred că este nevoie de asta în R, într-o zonă specifică în care ieșirile SAS sunt atât de informative.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.