Ricerca Sociale con R

Una wiki per l'analisi dei dati con R

Strumenti Utente

Strumenti Sito


r:tidyverse:pipe_operator

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()

grafico a punti

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()

istogramma

In questo contesto, il segnaposto non funzionerebbe con |>

1)
Stefan Milton Bache and Hadley Wickham (2014). magrittr: A Forward-Pipe Operator for R. R package version 1.5. https://CRAN.R-project.org/package=magrittr

Domande? Scrivimi

Messenger Telegram Email
r/tidyverse/pipe_operator.txt · Ultima modifica: 05/09/2025 16:49 da Agnese Vardanega