
Exportar y Ejecutar Pipelines Reproducibles
Serializar, leer,
inspeccionar y reejecutar analisis con sus_rap_export(),
sus_rap_read(), sus_rap_run() y
sus_rap_update()
Dr. Max Anjos
17 October, 2026
Source:vignettes/rap-01-exportar-executar.Rmd
rap-01-exportar-executar.RmdIntroduccion — Que es un RAP?
El problema de la reproducibilidad en epidemiologia ambiental
La investigacion en salud publica y epidemiologia ambiental en Brasil enfrenta un desafio creciente: como garantizar que un analisis realizado hoy — sobre mortalidad por enfermedades respiratorias en Sao Paulo en el invierno de 2022 — pueda ser reproducido, actualizado y auditado por otro investigador dentro de tres anos? Con distintas versiones de paquetes, bases de datos actualizadas, nuevos municipios a incluir?
Los Pipelines Analiticos Reproducibles (Reproducible Analytical Pipelines — RAPs) son la respuesta de la ciencia de datos gubernamental y academica a este problema. El concepto fue formalizado por el UK Government Data Science (2022) para garantizar que los analisis publicados por agencias publicas sean auditables, actualizables y ejecutables por cualquier colaborador con acceso al entorno correcto.
En climasus4r, el modulo RAP serializa todo el pipeline
de analisis — desde la importacion de los datos del DATASUS hasta la
agregacion temporal — en un archivo de texto portatil (.R,
.Rmd o .qmd), con metadatos de trazabilidad
embebidos. Esto significa que usted puede:
- Archivar el analisis junto al articulo como material suplementario
- Reejecutar el mismo pipeline para nuevas unidades federativas o periodos con un unico comando
- Comparar dos versiones del pipeline para identificar divergencias
- Actualizar parametros sin reabrir y editar el archivo manualmente
Portabilidad
El pipeline exportado es un archivo de texto estandar de R. Cualquier colaborador con climasus4r instalado puede reejecutarlo.
Trazabilidad
Metadatos automaticos registran la version de R, los paquetes, la fecha/hora y la plataforma en el momento de la exportacion.
Actualizabilidad
Parametros como UF, periodo y sistema DATASUS pueden ser sobrescritos sin editar el archivo exportado.
Comparabilidad
Dos versiones del pipeline pueden compararse lado a lado para identificar que cambio entre revisiones.
La clase rap_object
sus_rap_export() retorna un objeto de la clase S3
rap_object, que es una lista con nombre con siete
campos:
| Campo | Tipo | Descripcion |
|---|---|---|
metadata |
lista | Version de R, paquetes, timestamp, plataforma, semilla aleatoria |
params |
lista | Parametros detectados en el pipeline (uf, years, system, etc.) |
steps |
lista | Cada etapa del pipeline con su funcion y argumentos |
structure |
lista | Formato, tipo de salida, numero total de etapas |
source |
character | Ruta del archivo exportado en disco |
format |
character | Formato de la exportacion ("script",
"rmarkdown", etc.) |
raw |
character | Lineas del archivo exportado (para inspeccion directa) |
Prerrequisitos
Construyendo el pipeline de ejemplo
En este tutorial usaremos como caso conductor un analisis de
mortalidad por enfermedades respiratorias en el estado de Sao
Paulo, 2020-2022, importado del SIM-DO (Sistema de
Informaciones sobre Mortalidad). El pipeline se define con
quote(), que captura la expresion sin evaluarla:
pipeline <- quote(
sus_data_import(uf = "SP", years = 2020:2022, system = "SIM-DO") |>
sus_data_clean_encoding() |>
sus_data_standardize() |>
sus_data_filter_cid(cid_group = "respiratory") |>
sus_data_aggregate(by = "month", lang = "pt")
)Verificando la estructura del pipeline
# El objeto 'pipeline' es un objeto de lenguaje del tipo 'call'
class(pipeline)
#> [1] "call"
# Visualizando el arbol de llamadas
lobstr::ast(!!pipeline)
#> o-`|>`
#> +-o-`|>`
#> | +-o-`|>`
#> | | +-o-`|>`
#> | | | +-sus_data_import(uf = "SP", years = 2020:2022, system = "SIM-DO")
#> | | | \-sus_data_clean_encoding()
#> | | \-sus_data_standardize()
#> | \-sus_data_filter_cid(cid_group = "respiratory")
#> \-sus_data_aggregate(by = "month", lang = "pt")
sus_rap_export() — Serializar el Pipeline
Firma completa
sus_rap_export(
pipeline = NULL,
file_path = NULL,
format = c("script", "rmarkdown", "quarto", "function"),
include_metadata = TRUE,
include_validation = TRUE,
include_documentation = c("standard", "minimal", "comprehensive"),
output_type = c("analysis", "dashboard", "report"),
lang = "pt",
overwrite = FALSE
)Exportar como script R (formato estandar)
El formato "script" genera un archivo .R
autocontenido, con encabezado de metadatos, bloque de parametros, bloque
de validacion y el pipeline en si. Es el formato recomendado para
archivado y reejecucion via linea de comandos.
rap <- sus_rap_export(
pipeline = pipeline,
file_path = "analise_respiratoria_sp.R",
format = "script",
include_metadata = TRUE,
include_validation = TRUE,
include_documentation = "standard",
lang = "pt"
)
#> v Pipeline exportado para 'analise_respiratoria_sp.R'
#> i Formato : script
#> i Etapas : 5
#> i Parametros : uf, years, system, cid_group, by, lang
#> i Metadados : R 4.4.1 | climasus4r 0.1.0 | 2026-06-18 09:32:14Estructura del archivo generado
El archivo analise_respiratoria_sp.R exportado tiene la
siguiente estructura:
# ============================================================
# RAP gerado por climasus4r::sus_rap_export()
# Timestamp : 2026-06-18 09:32:14 BRT
# R version : 4.4.1 (2024-06-14)
# climasus4r: 0.1.0
# Plataforma: aarch64-apple-darwin20
# ============================================================
# -- PARAMETROS (edite aqui para reutilizar o pipeline) ------
params <- list(
uf = "SP",
years = 2020:2022,
system = "SIM-DO",
cid_group = "respiratory",
by = "month",
lang = "pt"
)
# -- VALIDACAO -----------------------------------------------
stopifnot(
is.character(params$uf),
all(params$years >= 1979),
params$system %in% c("SIM-DO", "SIH", "SINAN", "SIA", "CNES", "SINASC")
)
# -- PIPELINE ------------------------------------------------
resultado <- sus_data_import(
uf = params$uf, years = params$years, system = params$system
) |>
sus_data_clean_encoding() |>
sus_data_standardize() |>
sus_data_filter_cid(cid_group = params$cid_group) |>
sus_data_aggregate(by = params$by, lang = params$lang)Estructura del rap_object retornado
str(rap)
#> List of 7
#> $ metadata : list [r_version, packages, timestamp, platform, seed]
#> $ params : list [uf, years, system, cid_group, by, lang]
#> $ steps : list [5 pipeline steps]
#> $ structure: list [type, input_params, output_params, total_steps]
#> $ source : chr "analise_respiratoria_sp.R"
#> $ format : chr "script"
#> $ raw : chr [linhas do arquivo exportado]
#> - attr(*, "class")= chr [1:2] "rap_object" "list"
# Accediendo a campos individuales
rap$params$uf
#> [1] "SP"
rap$metadata$r_version
#> [1] "R version 4.4.1 (2024-06-14)"
rap$structure$total_steps
#> [1] 5Exportar como R Markdown
Para publicacion de informes reproducibles con narrativa, use
format = "rmarkdown". El archivo .Rmd generado
incluye encabezado YAML, bloques de configuracion y el pipeline dentro
de chunks ejecutables.
rap_rmd <- sus_rap_export(
pipeline = pipeline,
file_path = "relatorio_respiratorio_sp.Rmd",
format = "rmarkdown",
include_metadata = TRUE,
include_validation = TRUE,
include_documentation = "comprehensive",
output_type = "report",
lang = "pt"
)
#> v Pipeline exportado para 'relatorio_respiratorio_sp.Rmd'
#> i Formato : rmarkdown
#> i Etapas : 5
#> i output_type : report
#> i Documentacao : comprehensiveExportar como Quarto
El formato "quarto" genera un archivo .qmd
compatible con el sistema Quarto, ideal para documentos tecnicos
modernos con soporte para Python, Julia y ejecucion multiple de
engines.
rap_qmd <- sus_rap_export(
pipeline = pipeline,
file_path = "analise_respiratoria_sp.qmd",
format = "quarto",
output_type = "dashboard",
lang = "pt"
)
#> v Pipeline exportado para 'analise_respiratoria_sp.qmd'
#> i Formato: quarto | output_type: dashboardExportar como funcion encapsulada
El formato "function" es el mas adecuado para
integracion en paquetes o scripts de automatizacion. El pipeline se
encapsula en una funcion R con todos los parametros como argumentos
formales, lista para ser importada o reutilizada programaticamente.
rap_fn <- sus_rap_export(
pipeline = pipeline,
file_path = "run_analise_respiratoria.R",
format = "function",
lang = "pt"
)
#> v Pipeline exportado para 'run_analise_respiratoria.R'
#> i Formato: function
#> i Funcao gerada: run_pipeline(uf, years, system, cid_group, by, lang)El archivo generado contiene una funcion como esta:
run_pipeline <- function(
uf = "SP",
years = 2020:2022,
system = "SIM-DO",
cid_group = "respiratory",
by = "month",
lang = "pt"
) {
sus_data_import(uf = uf, years = years, system = system) |>
sus_data_clean_encoding() |>
sus_data_standardize() |>
sus_data_filter_cid(cid_group = cid_group) |>
sus_data_aggregate(by = by, lang = lang)
}Niveles de documentacion (include_documentation)
El parametro include_documentation controla la cantidad
de comentarios generados en el archivo exportado:
| Nivel | Descripcion |
|---|---|
"minimal" |
Solo el encabezado esencial y el bloque de parametros |
"standard" |
Encabezado, parametros, validacion y comentarios de etapa |
"comprehensive" |
Todo lo anterior + descripcion de cada funcion, tipos esperados y enlaces a la documentacion |
# Exportacion minima -- solo lo esencial
rap_min <- sus_rap_export(
pipeline = pipeline,
file_path = "analise_minima.R",
include_documentation = "minimal",
lang = "pt"
)
# Exportacion exhaustiva -- maxima trazabilidad
rap_full <- sus_rap_export(
pipeline = pipeline,
file_path = "analise_completa.R",
include_documentation = "comprehensive",
lang = "pt"
)
sus_rap_read() — Leer de Vuelta
Una vez exportado, el archivo .R (o
.Rmd/.qmd) puede leerse de vuelta a un
rap_object en cualquier sesion de R, aunque el pipeline
original ya no exista en memoria.
Firma
sus_rap_read(file_path, lang = "pt", validate = TRUE)Leyendo el archivo exportado
rap2 <- sus_rap_read("analise_respiratoria_sp.R", lang = "pt")
#> v Arquivo lido: 'analise_respiratoria_sp.R'
#> v Metadados validados
#> i R version : 4.4.1 (exportado em 2026-06-18 09:32:14)
#> i climasus4r : 0.1.0
#> i Etapas : 5
#> i Parametros : uf = "SP" | years = 2020:2022 | system = "SIM-DO"Imprimiendo el rap_object
El metodo print.rap_object() muestra un resumen
formateado del pipeline:
print(rap2)
#> -- RAP: analise_respiratoria_sp.R -----------------------
#> Formato : script
#> Exportado : 2026-06-18 09:32:14 BRT
#> R version : 4.4.1 | climasus4r 0.1.0
#> Plataforma: aarch64-apple-darwin20
#>
#> -- Parametros ------------------------------------------
#> uf : "SP"
#> years : 2020 2021 2022
#> system : "SIM-DO"
#> cid_group : "respiratory"
#> by : "month"
#> lang : "pt"
#>
#> -- Pipeline (5 etapas) ----------------------------------
#> [1] sus_data_import()
#> [2] sus_data_clean_encoding()
#> [3] sus_data_standardize()
#> [4] sus_data_filter_cid()
#> [5] sus_data_aggregate()
#> ---------------------------------------------------------
sus_rap_inspect() — Inspeccionar y Comparar
Firma
sus_rap_inspect(rap, rap2 = NULL, verbose = TRUE, lang = "pt")5.1 Inspeccion de un unico RAP
Con un unico rap_object, sus_rap_inspect()
muestra un resumen detallado del pipeline: etapas, parametros, metadatos
y, con verbose = TRUE, el codigo raw del archivo
exportado.
sus_rap_inspect(rap2, verbose = TRUE)
#> == Inspecao: analise_respiratoria_sp.R ==================
#>
#> METADADOS
#> Timestamp : 2026-06-18 09:32:14 BRT
#> R version : 4.4.1
#> climasus4r: 0.1.0
#> Plataforma: aarch64-apple-darwin20
#> Semente : nao definida
#>
#> ESTRUTURA
#> Formato : script
#> Total etapas : 5
#> Output type : analysis
#> Documentacao : standard
#>
#> PARAMETROS
#> uf = "SP"
#> years = 2020:2022
#> system = "SIM-DO"
#> cid_group = "respiratory"
#> by = "month"
#> lang = "pt"
#>
#> PIPELINE
#> [1] sus_data_import(uf, years, system)
#> [2] sus_data_clean_encoding()
#> [3] sus_data_standardize()
#> [4] sus_data_filter_cid(cid_group)
#> [5] sus_data_aggregate(by, lang)
#>
#> CODIGO (raw)
#> [ver arquivo: analise_respiratoria_sp.R]
#> =========================================================5.2 Comparacion entre dos RAPs (diff)
Al pasar dos rap_objects, sus_rap_inspect()
realiza un diff estructurado, identificando:
- Parametros que cambiaron de valor
- Etapas agregadas o eliminadas
- Divergencias en los metadatos (version de paquete, plataforma)
El escenario a continuacion compara el pipeline de Sao Paulo con una version equivalente exportada para Rio de Janeiro:
# Primero, exportamos el pipeline para el RJ
pipeline_rj <- quote(
sus_data_import(uf = "RJ", years = 2020:2022, system = "SIM-DO") |>
sus_data_clean_encoding() |>
sus_data_standardize() |>
sus_data_filter_cid(cid_group = "respiratory") |>
sus_data_aggregate(by = "month", lang = "pt")
)
sus_rap_export(
pipeline = pipeline_rj,
file_path = "analise_respiratoria_rj.R",
lang = "pt"
)
rap_rj <- sus_rap_read("analise_respiratoria_rj.R")
sus_rap_inspect(rap2, rap_rj)
#> == Diff: [1] analise_respiratoria_sp.R vs [2] analise_respiratoria_rj.R ==
#>
#> PARAMETROS ALTERADOS
#> uf : "SP" --> "RJ"
#>
#> PARAMETROS IDENTICOS
#> years, system, cid_group, by, lang
#>
#> ETAPAS
#> Identicas : 5/5 (nenhuma etapa adicionada ou removida)
#>
#> METADADOS
#> Timestamps : diferentes (2026-06-18 09:32:14 vs 2026-06-18 09:45:07)
#> R version : identicas (4.4.1)
#> climasus4r : identicas (0.1.0)
#>
#> CONCLUSAO: pipelines equivalentes com parametro 'uf' distinto.
#> =========================================================
sus_rap_run() — Reejecutar con Nuevos Parametros
Firma
sus_rap_run(rap, ..., envir = parent.frame(), dry_run = FALSE, lang = "pt")Los argumentos pasados via ... sobrescriben los
parametros del RAP solo en la ejecucion actual — el
archivo en disco no se modifica. Para modificar permanentemente el
archivo, use sus_rap_update() (seccion 7).
6.1 Simulacion con dry_run = TRUE
Antes de ejecutar el pipeline con nuevos parametros, se recomienda
verificar el codigo que se ejecutaria usando
dry_run = TRUE. No se abre ninguna conexion al DATASUS, no
se descarga ningun dato.
sus_rap_run(rap2, uf = "RJ", years = 2021:2023, dry_run = TRUE)
#> -- [dry_run] Codigo que seria executado ------------------
#>
#> sus_data_import(uf = "RJ", years = 2021:2023, system = "SIM-DO") |>
#> sus_data_clean_encoding() |>
#> sus_data_standardize() |>
#> sus_data_filter_cid(cid_group = "respiratory") |>
#> sus_data_aggregate(by = "month", lang = "pt")
#>
#> Parametros substituidos: uf = "RJ" | years = 2021:2023
#> Parametros mantidos : system, cid_group, by, lang
#> ----------------------------------------------------------
#> i Nenhum dado foi baixado (dry_run = TRUE)6.2 Ejecucion efectiva
Confirmado el codigo, elimine dry_run = TRUE para
ejecutar el pipeline:
resultado_rj <- sus_rap_run(
rap2,
uf = "RJ",
years = 2021:2023,
lang = "pt"
)
#> -- Executando RAP: analise_respiratoria_sp.R -------------
#> i Parametros substituidos: uf = "RJ" | years = 2021:2023
#> v [1/5] sus_data_import() ... 148.392 registros importados
#> v [2/5] sus_data_clean_encoding() ... concluido
#> v [3/5] sus_data_standardize() ... concluido
#> v [4/5] sus_data_filter_cid() ... 42.817 registros (cid_group = "respiratory")
#> v [5/5] sus_data_aggregate() ... 36 linhas (mensal, 2021-2023)
#> -- Pipeline concluido em 4.2 segundos --------------------
class(resultado_rj)
#> [1] "climasus_df" "tbl_df" "tbl" "data.frame"6.3 Sobrescribiendo multiples parametros
Usted puede sobrescribir tantos parametros como quiera en una unica llamada:
resultado_mg_anual <- sus_rap_run(
rap2,
uf = "MG",
years = 2019:2023,
by = "year",
lang = "en"
)
#> -- Executando RAP: analise_respiratoria_sp.R -------------
#> i Parametros substituidos: uf = "MG" | years = 2019:2023 | by = "year"
#> v Pipeline concluido em 6.1 segundos6.4 Control del entorno de ejecucion
El argumento envir define en que entorno se evalua el
pipeline. El predeterminado parent.frame() es adecuado para
uso interactivo. Para ejecuciones automatizadas en scripts o funciones,
pase envir = new.env() para aislar el pipeline:
env_isolado <- new.env(parent = baseenv())
resultado_iso <- sus_rap_run(
rap2,
uf = "CE",
envir = env_isolado
)
sus_rap_update() — Actualizar Parametros en el
Archivo
Firma
sus_rap_update(rap, ..., backup = TRUE, lang = "pt")Mientras que sus_rap_run() sustituye parametros solo
para la ejecucion actual (sin tocar el archivo),
sus_rap_update() edita permanentemente el
bloque de parametros en el archivo en disco. Esto es util cuando usted
quiere que la version “oficial” del pipeline refleje un cambio
permanente de alcance.
Actualizando la UF y el periodo
sus_rap_update(
rap2,
uf = c("RJ", "MG"),
years = 2021:2023,
lang = "pt"
)
#> i Backup criado: analise_respiratoria_sp.R.bak (2026-06-18 10:02:31)
#> v Parametros atualizados em 'analise_respiratoria_sp.R':
#> uf : "SP" --> c("RJ", "MG")
#> years : 2020:2022 --> 2021:2023
#> i Parametros nao alterados: system, cid_group, by, langEl bloque de parametros antes y despues
Antes de la actualizacion:
# -- PARAMETROS (edite aqui para reutilizar o pipeline) ------
params <- list(
uf = "SP",
years = 2020:2022,
system = "SIM-DO",
cid_group = "respiratory",
by = "month",
lang = "pt"
)Despues de la actualizacion:
Backup automatico
Por defecto, backup = TRUE crea una copia del archivo
original antes de cualquier modificacion, con el sufijo
.bak y timestamp. Esto garantiza que usted nunca pierda la
version anterior del pipeline:
# El backup se crea automaticamente:
# analise_respiratoria_sp.R.bak.2026-06-18_10-02-31
# Para restaurar manualmente:
file.copy(
"analise_respiratoria_sp.R.bak.2026-06-18_10-02-31",
"analise_respiratoria_sp.R",
overwrite = TRUE
)Recargando el RAP actualizado
Despues de la actualizacion, vuelva a leer el archivo para tener un
rap_object con los parametros nuevos reflejados en
memoria:
rap2_atualizado <- sus_rap_read("analise_respiratoria_sp.R")
# Confirme la actualizacion
rap2_atualizado$params$uf
#> [1] "RJ" "MG"
rap2_atualizado$params$years
#> [1] 2021 2022 2023Flujo Completo
El ciclo de vida completo de un RAP en climasus4r pasa
por seis etapas. El diagrama a continuacion ilustra la secuencia tipica
de uso:
Script completo de referencia
El codigo a continuacion reune todas las etapas en un unico script de referencia:
library(climasus4r)
# 1. Definir el pipeline con quote()
pipeline <- quote(
sus_data_import(uf = "SP", years = 2020:2022, system = "SIM-DO") |>
sus_data_clean_encoding() |>
sus_data_standardize() |>
sus_data_filter_cid(cid_group = "respiratory") |>
sus_data_aggregate(by = "month", lang = "pt")
)
# 2. Exportar a disco
rap <- sus_rap_export(
pipeline = pipeline,
file_path = "analise_respiratoria_sp.R",
format = "script",
include_documentation = "standard",
lang = "pt"
)
# 3. Volver a leer de disco (simula un colaborador recibiendo el archivo)
rap2 <- sus_rap_read("analise_respiratoria_sp.R")
# 4. Inspeccionar
sus_rap_inspect(rap2, verbose = TRUE)
# 5. Simular la ejecucion con nuevos parametros (sin descargar datos)
sus_rap_run(rap2, uf = "RJ", years = 2021:2023, dry_run = TRUE)
# 6. Ejecutar de verdad
resultado <- sus_rap_run(rap2, uf = "RJ", years = 2021:2023)
# 7. Actualizar parametros en el archivo para un alcance ampliado
sus_rap_update(rap2, uf = c("RJ", "MG"), years = 2021:2023)Tabla de referencia rapida
| Funcion | Entrada | Salida | Modifica el disco? |
|---|---|---|---|
sus_rap_export() |
quote(pipeline) |
rap_object |
Si (crea archivo) |
sus_rap_read() |
ruta del archivo | rap_object |
No |
sus_rap_inspect() |
1 o 2 rap_object
|
salida en consola | No |
sus_rap_run() |
rap_object |
climasus_df |
No |
sus_rap_update() |
rap_object + params |
rap_object (invisible) |
Si (edita archivo) |
Referencias
Wilson G, Bryan J, Cranston K, Kitzes J, Nederbragt L, Teal TK (2017). Good enough practices in scientific computing. PLOS Computational Biology, 13(6), e1005510. https://doi.org/10.1371/journal.pcbi.1005510
Marwick B, Boettiger C, Mullen L (2018). Packaging data analytical work reproducibly using R (and friends). The American Statistician, 72(1), 80-88. https://doi.org/10.1080/00031305.2017.1375986
UK Government Data Science (2022). Reproducible Analytical Pipelines (RAP) Strategy. Cabinet Office, His Majesty’s Government. https://analysisfunction.civilservice.gov.uk/support/reproducible-analytical-pipelines/
Anjos M (2026). climasus4r: Analisis integrado salud-clima-ambiente en Brasil. R package version 0.1.0. https://github.com/ByMaxAnjos/climasus4r
Navegacion: Anterior: Tutoriales Tematicos | Siguiente: RAP 2 - Pipelines con targets
climasus4r · Analisis integrado salud-clima-ambiente en Brasil
Encontro un problema o tiene sugerencias para este tutorial?
🐛 Reportar en GitHub