Pipe programming

Antonio J. Pérez-Luque

Instituto de Ciencias Forestales (CIFOR) | INIA-CSIC (Madrid)

2025-01-14

¿Pipe programming?

  • pipe (tubería) es una técnica de programación que permite encadenar funciones de manera secuencial
  • Permite pasar información de un proceso o comando a otro de manera ordenada y secuencial
  • Es un proceso de comunicación entre los procesos de una sola vía
  • La salida de un proceso se convierte en la entrada del siguiente proceso

Source: Arthur Welle

Ejemplo

set.seed(123) 
x <- runif(10) 
x 
 [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055
 [8] 0.8924190 0.5514350 0.4566147
x_sort <- sort(x) 
x_log <- log(x_sort) 
x_diff <- diff(x_log) 
x_exp <- exp(x_diff) 
ybase <- cumsum(x_exp) 
ybase
[1]  6.312546  7.734691  8.851172 10.007739 11.051915 12.481467 13.601614
[8] 14.612261 15.666101
# ybase <- cumsum(exp(diff(log(sort(x)))))
ypipe <- x |> 
  sort() |>     
  log() |>      
  diff() |>    
  exp() |>      
  cumsum()

ypipe
[1]  6.312546  7.734691  8.851172 10.007739 11.051915 12.481467 13.601614
[8] 14.612261 15.666101

Tipos de pipes

  1. magrittr
%>%


library(magrittr)

  1. R base
|> 

¿Cómo incluir pipes en el código?

Windows

Ctrl + Shift + M


Mac

Cmd + Shift + M

Mas ejemplos

  • Calcula el histograma de frecuencias del área basal de los diferentes pinos muestrados en una parcela
dbh <- c(5.0, 70.2, 7.0, 95.5, 87.3, 6.8, 65.0, 110.5, 80.5, 120.0)

dbh_filtrado <- subset(dbh, dbh > 7.5)

area_basal <- pi * (dbh_filtrado / 200)^2

h <- hist(area_basal,
  main = "Histograma",
  xlab = expression("Área Basal (" * m^2 * ")"),
  ylab = "Frecuencia"
)
1
Crear un vector de DBH (diámetros en cm)
2
Filtrar valores de DBH mayores de 7.5 cm
3
Calcular el área basal (en cm²) para cada valor filtrado
4
Generar un histograma de las áreas basales

Mas ejemplos

  • Calcula el histograma de frecuencias del área basal de los diferentes pinos muestrados en una parcela
library(magrittr)
dbh %>%
  subset(. > 7.5) %>%  
  {(pi * (. / 200)^2)} %>%                     
  hist(                                      
    main = "magrittr",
    xlab = expression("Área Basal (" * m^2 * ")"),
    ylab = "Frecuencia",
    col = "lightblue"
  )

dbh |>
  (\(x) subset(x, x > 7.5))() |>
  (\(x) pi * (x / 200)^2)() |>
  hist(
    main = "R pipe",
    xlab = expression("Área Basal (" * m^2 * ")"),
    ylab = "Frecuencia",
    col = "blue",
  )

Práctica

Calcular la altura media de los árboles de Pinus pinaster

library(tibble)

pinos <- tibble(
  id = 1:10,
  especie = c("sylvestris", "nigra", "pinaster", "sylvestris", "nigra",
              "pinaster", "sylvestris", "nigra", "pinaster", "sylvestris"),
  dbh_cm = c(30.5, 6.5, 7.2, 5.0, 28.3, 35.1, 7.0, 6.8, 40.0, 32.7), 
  altura_m = c(12.5, 13.2, 10.0, 9.5, 14.0, 15.0, 8.2, 11.8, 14.5, 12.0) 
)

pinos
# A tibble: 10 × 4
      id especie    dbh_cm altura_m
   <int> <chr>       <dbl>    <dbl>
 1     1 sylvestris   30.5     12.5
 2     2 nigra         6.5     13.2
 3     3 pinaster      7.2     10  
 4     4 sylvestris    5        9.5
 5     5 nigra        28.3     14  
 6     6 pinaster     35.1     15  
 7     7 sylvestris    7        8.2
 8     8 nigra         6.8     11.8
 9     9 pinaster     40       14.5
10    10 sylvestris   32.7     12  
# Encadena funciones 
  
mean(subset(pinos, especie == "pinaster")$altura_m)
[1] 13.16667


# Crea objetos temporales 
pinaster <- pinos[pinos$especie == "pinaster", ] 
altura_media_pinaster <- mean(pinaster$altura_m)
altura_media_pinaster 
[1] 13.16667
library(magrittr)

altura_media_pinaster <- pinos %>%
  subset(especie == "pinaster") %>%
  .$altura_m %>% 
  mean() 

altura_media_pinaster
[1] 13.16667
altura_media_pinaster <- 

pinos |>
  subset(especie == "pinaster") |>
  (\(.) mean(.$altura_m))() 
  

pinos |>
  subset(especie == "pinaster") |>
  (\(data) mean(data$altura_m))() 
[1] 13.16667

¿Como podría calcular la altura media por especie?

Code
library(dplyr)
  
pinos |> 
  group_by(especie) |> 
  summarise(altura_media = mean(altura_m))

¿Y solo de aquellos individuos que tengan DBH > 7.5 cm? ¿y cuantos son?

Code
pinos |> 
  filter(dbh_cm > 7.5) |>
  group_by(especie) |> 
  summarise(altura_media = mean(altura_m), 
            n = n())

Recursos

¿Alguna duda?

Ayuda JDC2022-050056-I financiada por MCIN/AEI /10.13039/501100011033 y por la Unión Europea NextGenerationEU/PRTR

Si usas esta presentación puedes citarla como:

Pérez-Luque, A.J. (2025). Pipe programming. Material Docente de la Asignatura: Ciclo de Gestión de los Datos. Master Universitario en Conservación, Gestión y Restauración de la Biodiversidad. Universidad de Granada. https://ecoinfugr.github.io/ecoinformatica/