Pipe operator (piping in R)
Il forward operator (forward pipe operator) è un operatore che consente di collegare diverse operazioni in modo sequenziale, portando il risultato di una funzione come input della funzione successiva.
A partire dalla versione 4.1 di R, l'operatore |> ha affiancato %>% del pacchetto magrittr1).
Rispetto a %>%, l'operatore |> non richiede pacchetti aggiuntivi, ed è pensato per integrarsi meglio con il linguaggio di base. D'altra parte |> è più rigido, il che può essere un vantaggio nel contesto della programmazione funzionale, dove la precisione del coding è fondamentale.
Non è un caso se il pacchetto si chiama magrittr: “Ceci n'est pas une pipe” è una celebre citazione di René Magritte, riportata in un dipinto che rappresenta una pipa. Analogamente, l'operatore %>% non è un vero “pipe” nel senso che i dati non vengono effettivamente passati da un processo all'altro.
Nella maggior parte dei casi, è quindi preferibile usare %>%, essendo flessibile, e oramai ampiamente utilizzato nell'ambito del tidyverse.
Introduzione
L'interpretazione più semplice che possiamo dare di entrambi questi operatori è:
primo comando (= fai questo) %>%
secondo comando (= e poi fai questo, sullo stesso oggetto)
Ad esempio, possiamo prima indicare i dati e poi dare il comando per il grafico:
cars |> plot()
oppure
subset(cars, speed > 9) |> plot()
oppure, con %>
library(dplyr) cars %>% subset(speed > 9) %>% plot()
La funzione subset() è stata applicata ai dati, e il risultato + stato portato alla funzione plot().
Operare sui dati in fasi successive
L'operatore è comodo soprattutto in quanto consente di semplificare la scrittura del codice, evitando ripetizioni all'interno dello script, e/o la costruzione di oggetti intermedi.
1. Controlliamo il nome delle variabili
as_tibble(cars)
# A tibble: 50 × 2 speed dist <dbl> <dbl> 1 4 2 2 4 10 3 7 4 4 7 22 5 8 16 6 9 10 7 10 18 8 10 26 9 10 34 10 11 17 # … with 40 more rows
2. Controlliamo il risultato del subset, aggiungendo il secondo comando:
as_tibble(cars) %>% subset(speed > 9)
# A tibble: 44 × 2 speed dist <dbl> <dbl> 1 10 18 2 10 26 3 10 34 4 11 17 5 11 28 6 12 14 7 12 20 8 12 24 9 12 28 10 13 26 # … with 34 more rows
3. E infine creiamo il grafico
as_tibble(cars) %>% subset(speed > 9) %>% plot()
La funzione plot() si applicherà al risultato di subset(cars, speed > 9).
Quanto più lunghi e complessi sono i comandi, tanto maggiore è naturalmente il vantaggio che se ne ricava.
Il 'segnaposto'
Nel caso che segue otteniamo un messaggio di errore:
cars$speed %>% subset(speed > 9) %>% hist()
Error in hist.default() : argument "x" is missing, with no default
La funzione subset() si applica al dataframe (alle righe), e non ad una variabile, come abbiamo scritto nella prima riga (cars$speed).
Dobbiamo usare qui un segnaposto (.) che sostituisce l'oggetto atteso dalla funzione, alla stregua di un "pronome".
cars$speed %>% subset(. > 9) %>% hist()
In questo contesto, il segnaposto non funzionerebbe con |>


