Creando una función para consultar datos en R

Crea tu propia API para obtener cifras desde bases de datos más rápido

23/5/2026

datos Chile funciones

En este tutorial veremos cómo crear una función en R diseñada para consultar datos. Este puede ser el primer paso para crear una API, una herramienta para entregarle a una inteligencia artificial, o simplemente algo conveniente de hacer para consultar datos.

Como ejemplo, crearemos una función para consultar la población de comunas, regiones, provincias o país según resultados del Censo 2024, diseñada para registrarla como herramienta para LLMs y así hacer que la IA pueda consultar datos de población censal.

En el siguiente repositorio está el código completo de la función que vamos a crear:


En R es muy fácil filtrar y seleccionar cualquier base de datos para obtener las cifras que quieras.

Basándonos en el Censo 2024 de Chile, si queremos (por ejemplo) saber la población de una comuna, cargamos el Censo, filtramos la comuna con filter(), luego agrupamos por comuna con group_by() y finalmente sumamos las observaciones con summarize() para obtener la población:

library(arrow)
censo <- open_dataset("~/Documents/Datos/Censo/2024/personas_censo2024.parquet")
library(arrow)

# cargar censo
censo <- open_dataset("personas_censo2024.parquet")
library(dplyr)

censo |> 
  filter(comuna == 13110) |> 
  group_by(comuna) |> 
  summarize(poblacion = n()) |> 
  collect()
# A tibble: 1 × 2
  comuna poblacion
   <int>     <int>
1  13110    374836

Así obtuvimos la población de La Florida (había que saberse o buscar el código único territorial eso sí 😅).

Ahora, si queremos la población por sexo, cambiamos la agrupación para hacer el conteo de observaciones por comuna y sexo:

censo |> 
  filter(comuna == 13110) |> 
  group_by(comuna, sexo) |> 
  summarize(poblacion = n()) |> 
  collect()
# A tibble: 2 × 3
# Groups:   comuna [1]
  comuna  sexo poblacion
   <int> <int>     <int>
1  13110     2    196375
2  13110     1    178461

Luego, si quieres lo mismo pero para otra comuna, copias el código y cambias el filtro, y así. Después lo necesitas para una región, y tienes que copiar el código, cambiarlo de nuevo…

Si necesitamos hacer esto muy seguido, de repente es mejor optimizarlo. Como dijo Dios en la biblia:

Deberías considerar escribir una función cuando has copiado y pegado un bloque de código más de dos veces.

Hadley Wickham

Funciones en R

Crear una función sirve para ejecutar un conjunto de operaciones de forma más simple, al abstraer el código en un único comando que es más rápido y cómodo de usar.

Lo que antes eran varias líneas de código puede resumirse en una función como filtrar_datos() o similar.

Las funciones también nos ayudan a reutilizar el código al empaquetarlo en una forma más conveniente.

Crearemos una función que sirva para ayudar a obtener cifras de una base de datos. Usaremos como ejemplo el Censo, pero podrás usar estos principios para cualquier otra base de datos, siempre y cuando esté ordernadita.

Aprendiendo esto estarás a un paso de crear tu propia API!

Datos

Los datos que usaremos son una versión de los resultados del Censo 2024 en formato tidy, procesados en R con este script. Esto quiere decir que cada columna representa una variable, y cada fila representa una observación.

Carguemos los datos para explorarlos:

library(readr)

censo <- read_csv2("censo_2024_tidy.csv")

Si no quieres descargar los datos, puedes cargarlos directamente desde internet así:

library(readr)

censo <- read_csv2("https://github.com/bastianolea/censo_poblacion_consultar/raw/master/datos/censo_2024_tidy.csv")

Ahora miremos cómo vienen:

library(dplyr)

censo |> 
select(-contains("codigo"))
nivel comuna provincia region sexo edad poblacion
Comuna Iquique Iquique Tarapacá Hombres 0-4 5052
Comuna Iquique Iquique Tarapacá Hombres 5-9 6565
Comuna Iquique Iquique Tarapacá Hombres 10-14 7482
Comuna Iquique Iquique Tarapacá Hombres 15-19 6664
Comuna Iquique Iquique Tarapacá Hombres 20-24 6804
Comuna Iquique Iquique Tarapacá Hombres 25-29 8211

Tenemos columnas que describen la unidad geográfica (comuna, provincia, region), dos variables sociodemográficas (sexo y edad) y finalmente la cantidad de poblacion que cumple los criterios anteriores.

Es decir, cada fila del dataframe describe un grupo de personas con carcterísticas específicas.

Además tenemos la variable nivel que describe si los datos vienen por Comuna, Provincia, Región o País. Por ejemplo:

censo |> 
select(-contains("codigo")) |> 
filter(nivel == "Provincia")
nivel comuna provincia region sexo edad poblacion
Provincia NA Iquique Tarapacá Hombres 0-4 10346
Provincia NA Iquique Tarapacá Hombres 5-9 13002
Provincia NA Iquique Tarapacá Hombres 10-14 14154
Provincia NA Iquique Tarapacá Hombres 15-19 12961
Provincia NA Iquique Tarapacá Hombres 20-24 13145
Provincia NA Iquique Tarapacá Hombres 25-29 14644

O sea que tenemos los datos de la población visto desde cuatro perspectivas, dependiendo del nivel territorial que nos interese.

Crear una función

Tenemos un dataframe que debe ser filtrado de varias maneras para llegar a una cifra específica.

Sería súper conveniente tener una función llamada algo así como consultar_censo() a la que podamos pedirle cosas como consultar_censo(region = "Maule") para obtener la población de una región, consultar_censo(comuna = "Pirque") para la de una comuna, o bien cosas más complejas como consultar_censo(comuna = "Cerrillos", sexo = "Mujeres", edad = "30-35").

Crearemos una función que vaya filtrando los datos dependiendo de lo que se pida en sus argumentos.

A medida que se van haciendo los filtros, podremos agregar cosas como mensajes que describan lo que se va obteniendo, o aplicar validaciones para confirmar que las regiones existen, si las edades son válidas, etc., y finalmente podremos personalizar cómo se entregan los resultados, entre otros beneficios.

Primero creamos la función:

consultar_censo <- function() {}

Con lo anterior creamos una función que no hace nada. Dentro de los paréntesis de llave ({}) irá todo el código.

Argumentos

Dentro del paréntesis de function() van a ir los argumentos que entreguemos al usar la función (como el filtro de edad o sexo). Por medio de los argumentos podremos consultar los datos.

Para agregar argumentos a una función, solamente hay que indicar su nombre dentro de function(), o bien poner el argumento especificando su valor por defecto (el que tendrán si se dejan vacíos):

consultar_censo <- function(
edad = "Total",
sexo = "Total"
) {
}

Al ejecutar una función, el código en su interior se ejecuta dentro de un entorno propio, y este entorno podrá acceder a los argumentos como objetos que contienen el valor que el/la usuario/a les de. Es decir, cuando ejecutemos la función, los argumentos van a pasar hacia dentro de la función y podremos usarlos como si fueran objetos normales de R.

Por ejemplo, podemos hacer que la función diga lo que recibe:

consultar_censo <- function(
    edad = "Total",
    sexo = "Total"
) {
  require(cli)
  
  cli_alert("edad: {edad}")
  cli_alert("sexo: {sexo}")
}
consultar_censo(edad = "30-34", sexo = "Hombres")
Loading required package: cli

→ edad: 30-34

→ sexo: Hombres

Revisar una función

Para probar la función podemos simular sus argumentos, creando objetos que se llamen igual. Por ejemplo, hagamos como que estamos en la función anterior para probar cómo salen los mensajes:

sexo <- "Mujeres"

cli_alert("sexo: {sexo}")
→ sexo: Mujeres

Pero también podemos entrar a la función mientras se ejecuta interrumpiendo su ejecución con la función browser(). Si pones browser() dentro de la función, guardas la función y la usas, la ejecución se detendrá en la línea exacta y estarás dentro del entorno de la función, pudiendo acceder a los argumentos reales:

prueba <- function(numero) {
  message("iniciando")
  browser() # interrumpir la ejecución
  numero * 100
}

prueba(6)
> prueba(6)
iniciando
Called from: prueba(6)
Browse[1]> numero
[1] 6

Aquí entramos a la función y pudimos consultar directamente el valor del argumento numero, y probar a mano cómo va a salir la multiplicación, por ejemplo, para probar qué pasa si alguien pone como argumento un NA, y resolverlo de inmediato!

Filtros

Empecemos a hacer que la función filtre los datos. Para ello simplemente usamos los argumentos dentro de filter().

Pero puede ser que en este paso enfrentemos un primer problemita: como las palabras no son infinitas, a veces puede ser que los argumentos de la función se llamen igual que las columnas del dataframe que queremos filtrar. Esto hará que, cuando intentemos filtrar, R se confunda 😵‍💫

Ejemplo de la confusión:

sexo <- "Mujeres"

censo |> 
  filter(sexo == sexo) |> 
  select(sexo)
# A tibble: 23,825 × 1
   sexo   
   <chr>  
 1 Hombres
 2 Hombres
 3 Hombres
 4 Hombres
 5 Hombres
 6 Hombres
 7 Hombres
 8 Hombres
 9 Hombres
10 Hombres
# ℹ 23,815 more rows
Resultado incorrecto! R intentó filtrar la columna sexo con sus propios valores

R se confunde porque tiene dos objetos que se llaman igual: un objeto en el entorno, y una columna dentro del contexto de la evaluación de {dplyr}.

Para solucionar la ambiguedad, podemos cambiar el nombre de los argumentos (por ejemplo, anteponiéndoles un punto, onda .sexo), o bien, especificándole a {dplyr} que los valores que vienen desde afuera del dataframe:

sexo <- "Mujeres"

censo |> 
  filter(sexo == .env$sexo) |> 
  select(sexo)
# A tibble: 7,936 × 1
   sexo   
   <chr>  
 1 Mujeres
 2 Mujeres
 3 Mujeres
 4 Mujeres
 5 Mujeres
 6 Mujeres
 7 Mujeres
 8 Mujeres
 9 Mujeres
10 Mujeres
# ℹ 7,926 more rows
Ahora sí!

Anteponiendo .env$ al argumento, explicitamos que el objeto que estamos usando viene desde el entorno de la función, y no es una columna del dataframe. Inversamente, podemos explicitar también con .data$ que nos referimos a una columna de un dataframe y no a un objeto del entorno.

Apliquemos lo anterior para poder usar filtros basados en los argumentos:

consultar_censo <- function(
    nivel = "País",
    edad = "Total",
    sexo = "Total"
) {
  
  # filtros
  filtrado <- censo |>
    filter(
      nivel == .env$nivel,
      edad == .env$edad,
      sexo == .env$sexo
    )
  
  return(filtrado)
}

Ahora no habrá ambigüedad, y podemos probar la función:

consultar_censo(nivel = "País",
                edad = "25-29",
                sexo = "Mujeres") |> 
  glimpse()
Rows: 1
Columns: 10
$ nivel            <chr> "País"
$ codigo_comuna    <dbl> NA
$ comuna           <chr> NA
$ codigo_provincia <dbl> NA
$ provincia        <chr> NA
$ codigo_region    <dbl> NA
$ region           <chr> NA
$ sexo             <chr> "Mujeres"
$ edad             <chr> "25-29"
$ poblacion        <dbl> 689840
consultar_censo(nivel = "País",
                edad = "30-34",
                sexo = "Total") |> 
  glimpse()
Rows: 1
Columns: 10
$ nivel            <chr> "País"
$ codigo_comuna    <dbl> NA
$ comuna           <chr> NA
$ codigo_provincia <dbl> NA
$ provincia        <chr> NA
$ codigo_region    <dbl> NA
$ region           <chr> NA
$ sexo             <chr> "Total"
$ edad             <chr> "30-34"
$ poblacion        <dbl> 1527489

Va tomando forma! La función sirve para filtrar datos a nivel de país, filtrando por edad y sexo.

Filtros por columnas

Para filtrar una comuna, provincia o región, tenemos tres columnas distintas. Necesitamos una forma donde, dependiendo del argumento que demos, el filtro se aplique a las columnas respectivas (comuna, provincia o region).

Una forma simple de solucionarlo sería con if else.

Hagamos una prueba primero:

region <- NULL
provincia <- NULL
comuna <- "Puente Alto"

# si la comuna no es nula
if (!is.null(comuna)) {
  censo |> 
    filter(nivel == "Comuna") |> 
    filter(comuna == .env$comuna)
  
} else if (!is.null(region)) {
  # si la comuna es nula pero la región no es nula
  censo |> 
    filter(nivel == "Región") |> 
    filter(region == .env$region)
}
# A tibble: 57 × 10
   nivel  codigo_comuna comuna   codigo_provincia provincia codigo_region region
   <chr>          <dbl> <chr>               <dbl> <chr>             <dbl> <chr> 
 1 Comuna         13201 Puente …              132 Cordille…            13 Metro…
 2 Comuna         13201 Puente …              132 Cordille…            13 Metro…
 3 Comuna         13201 Puente …              132 Cordille…            13 Metro…
 4 Comuna         13201 Puente …              132 Cordille…            13 Metro…
 5 Comuna         13201 Puente …              132 Cordille…            13 Metro…
 6 Comuna         13201 Puente …              132 Cordille…            13 Metro…
 7 Comuna         13201 Puente …              132 Cordille…            13 Metro…
 8 Comuna         13201 Puente …              132 Cordille…            13 Metro…
 9 Comuna         13201 Puente …              132 Cordille…            13 Metro…
10 Comuna         13201 Puente …              132 Cordille…            13 Metro…
# ℹ 47 more rows
# ℹ 3 more variables: sexo <chr>, edad <chr>, poblacion <dbl>

Sirve! Dependiendo del argumento que rellenemos, se filtran distintas columnas.

Ahora complementamos la función para que tenga esta capacidad de filtrar distintas columnas dependiendo de los argumentos:

consultar_censo <- function(
    region = NULL,
    provincia = NULL,
    comuna = NULL,
    edad = "Total",
    sexo = "Total"
) {
  require(dplyr)
  require(cli)
  
  # mensajes
  cli_alert("edad: {edad}")
  cli_alert("sexo: {sexo}")
  
  # filtros generales
  filtrado <- censo |>
    filter(
      edad == .env$edad,
      sexo == .env$sexo
    )
  
  # filtros de territorio
  if (!is.null(comuna)) {
    cli_alert_info("datos nivel comunal: {comuna}")
    
    filtrado <- filtrado |> 
      filter(nivel == "Comuna") |> 
      filter(comuna == .env$comuna)
    
  } else if (!is.null(provincia)) {
    cli_alert_info("datos nivel provincial: {provincia}")
    
    filtrado <- filtrado |> 
      filter(nivel == "Provincia") |> 
      filter(provincia == .env$provincia)
    
  } else if (!is.null(region)) {
    cli_alert_info("datos nivel regional: {region}")
    
    filtrado <- filtrado |> 
      filter(nivel == "Región") |> 
      filter(region == .env$region)
  }
  
  return(filtrado)
}

Probemos:

consultar_censo(comuna = "La Florida") |> 
  glimpse()
→ edad: Total

→ sexo: Total

ℹ datos nivel comunal: La Florida

Rows: 1
Columns: 10
$ nivel            <chr> "Comuna"
$ codigo_comuna    <dbl> 13110
$ comuna           <chr> "La Florida"
$ codigo_provincia <dbl> 131
$ provincia        <chr> "Santiago"
$ codigo_region    <dbl> 13
$ region           <chr> "Metropolitana de Santiago"
$ sexo             <chr> "Total"
$ edad             <chr> "Total"
$ poblacion        <dbl> 374836
consultar_censo(provincia = "Cordillera") |> 
  glimpse()
→ edad: Total

→ sexo: Total

ℹ datos nivel provincial: Cordillera

Rows: 1
Columns: 10
$ nivel            <chr> "Provincia"
$ codigo_comuna    <dbl> NA
$ comuna           <chr> NA
$ codigo_provincia <dbl> 132
$ provincia        <chr> "Cordillera"
$ codigo_region    <dbl> 13
$ region           <chr> "Metropolitana de Santiago"
$ sexo             <chr> "Total"
$ edad             <chr> "Total"
$ poblacion        <dbl> 614587

Increíble señores!

Validación

Otro beneficio de crear funciones para este tipo de operaciones es poder agregar pasos intermedios, tales como revisiones o validaciones que confirmen el funcionamiento correcto de la función, y si es necesario arrojar un error o sugerir soluciones.

Probemos la función para filtrar datos regionales:

consultar_censo(region = "Maule",
                sexo = "Hombres") |> 
  glimpse()
→ edad: Total

→ sexo: Hombres

ℹ datos nivel regional: Maule

Rows: 1
Columns: 10
$ nivel            <chr> "Región"
$ codigo_comuna    <dbl> NA
$ comuna           <chr> NA
$ codigo_provincia <dbl> NA
$ provincia        <chr> NA
$ codigo_region    <dbl> 7
$ region           <chr> "Maule"
$ sexo             <chr> "Hombres"
$ edad             <chr> "Total"
$ poblacion        <dbl> 545255

Ahora veamos qué pasa si nos equivocamos:

consultar_censo(region = "Miaaauuule")
→ edad: Total

→ sexo: Total

ℹ datos nivel regional: Miaaauuule

# A tibble: 0 × 10
# ℹ 10 variables: nivel <chr>, codigo_comuna <dbl>, comuna <chr>,
#   codigo_provincia <dbl>, provincia <chr>, codigo_region <dbl>, region <chr>,
#   sexo <chr>, edad <chr>, poblacion <dbl>

Cero filas! 🤨 La función simplemente retorna una tabla vacía.

Hagamos que la función revise si el argumento es correcto al confirmar si existe entre los valores posibles:

region <- "Miaule" # prrr 🐾

region %in% unique(censo$region)
[1] FALSE

Falso falso! ❌

Podemos aprovechar de hacer algo cuando la revisión no se cumpla. Podemos poner un if que revise si el valor del argumento está entre los valores posibles, y si no está, tiramos un error con cli_abort("error: región incorrecta!"):

if (nivel == "Región") {
# revisar si la región es válida
if (territorio %in% unique(censo$region)) {
filtrado <- filtrado |> 
filter(region == territorio)
} else {
# si región no es válida, error
cli_abort("error: región incorrecta!") 
}
}

Agreguémoslo a la función:

consultar_censo <- function(
    region = NULL,
    provincia = NULL,
    comuna = NULL,
    edad = "Total",
    sexo = "Total"
) {
  require(dplyr)
  require(cli)
  
  # mensajes
  cli_alert("edad: {edad}")
  cli_alert("sexo: {sexo}")
  
  # filtros generales
  filtrado <- censo |>
    filter(
      edad == .env$edad,
      sexo == .env$sexo
    )
  
  # filtros de territorio
  if (!is.null(comuna)) {
    # revisar si la comuna es válida
    if (comuna %in% unique(censo$comuna)) {
      cli_alert_info("datos nivel comunal: {comuna}")
      
      filtrado <- filtrado |> 
        filter(nivel == "Comuna") |> 
        filter(comuna == .env$comuna)
    } else {
      # si comuna no es válida, error
      cli_abort("error: comuna incorrecta!") 
    }
    
  } else if (!is.null(provincia)) {
    # revisar si la provincia es válida
    if (provincia %in% unique(censo$provincia)) {
      cli_alert_info("datos nivel provincial: {provincia}")
      
      filtrado <- filtrado |> 
        filter(nivel == "Provincia") |> 
        filter(provincia == .env$provincia)
    } else {
      # si provincia no es válida, error
      cli_abort("error: provincia incorrecta!") 
    }
    
  } else if (!is.null(region)) {
    # revisar si la región es válida
    if (region %in% unique(censo$region)) {
      cli_alert_info("datos nivel regional: {region}")
      
      filtrado <- filtrado |> 
        filter(nivel == "Región") |> 
        filter(region == .env$region)
    } else {
      # si región no es válida, error
      cli_abort("error: región incorrecta!") 
    }
  }
  return(filtrado)
}

Probemos nuevamente el error:

consultar_censo(region = "Miaule")
→ edad: Total

→ sexo: Total

Error in `consultar_censo()`:
! error: región incorrecta!
consultar_censo(comuna = "La Flower")
→ edad: Total

→ sexo: Total

Error in `consultar_censo()`:
! error: comuna incorrecta!

Incluso podríamos agregar formas de intentar solucionar el error, o sugerencias para nuestros usuarixs. Por ejemplo, algo como:

regiones <- censo |> filter(nivel == "Región") |> pull(region) |> unique()

library(glue)

regiones <- glue_collapse(regiones, sep = ", ", last = " o ")

glue("Las regiones posibles son: {regiones}. Avíspate")
Las regiones posibles son: Tarapacá, Antofagasta, Atacama, Coquimbo, Valparaíso, Libertador General Bernardo O'Higgins, Maule, Biobío, La Araucanía, Los Lagos, Aysén del General Carlos Ibáñez del Campo, Magallanes y de la Antártica Chilena, Metropolitana de Santiago, Los Ríos, Arica y Parinacota o Ñuble. Avíspate

Ahora habría que cubrir otros casos donde la función se use de manera incorrecta. En nuestro caso, no tendría sentido lógico filtrar a la vez por una región y por una comuna.

Probemos cómo validar que solamente uno de los tres argumentos territoriales no sea nulo:

# simulamos los tres objetos
region <- NULL
provincia <- NULL
comuna <- "Puente Alto"

# vemos cuáles no son nulos
no_nulos <- c(
  !is.null(region), 
  !is.null(provincia), 
  !is.null(comuna)
)

# confirmamos que sea solo 1 no nulo
if (sum(no_nulos) == 1) {
  message("ok!")
} else {
  cli_abort("error: solo se puede definir un argumento territorial a la vez!")
}
ok!

Entonces podemos poner un chequeo así dentro de la función para detenerla antes de que les usuaries hagan cosas inesperadas.

Resultado

Hasta ahora la función ha retornado simplemente los datos filtrados. Pero, como la función es nuestra, podemos personalizar lo que entregue. Como en este caso solamente entrega una cifra a la vez, no tiene mucho sentido entregar un dataframe.

En su lugar, podemos hacer que la función retorne solamente el valor de la columna que sea relevante, o una versión más chica del dataframe.

Simplemente agregando al final de la función algo como pull(poblacion) o select(poblacion) |> pull() podemos hacer que la función entregue solamente el número de población, sin el resto de las columnas. O también, agregando scales::number_format() podemos formatear las cifras para que se entreguen con puntos de miles.

Agreguemos esto y el error que vimos antes a la función para tener su forma definitiva:

consultar_censo <- function(
    region = NULL,
    provincia = NULL,
    comuna = NULL,
    edad = "Total",
    sexo = "Total"
) {
  require(dplyr)
  require(cli)
  require(glue)
  require(scales)
  
  # revisar argumentos territoriales
  no_nulos <- c(
    !is.null(region), 
    !is.null(provincia), 
    !is.null(comuna)
  )
  
  # error si hay más de 1 territorio definido
  if (sum(no_nulos) != 1) {
    cli_abort("error: solo se puede definir un argumento territorial a la vez!")
  }
  
  # filtros generales
  filtrado <- censo |>
    filter(
      edad == .env$edad,
      sexo == .env$sexo
    )
  
  # filtros de territorio
  if (!is.null(comuna)) {
    # revisar si la comuna es válida
    if (comuna %in% unique(censo$comuna)) {
      cli_alert_info("datos nivel comunal: {comuna}")
      
      filtrado <- filtrado |> 
        filter(nivel == "Comuna") |> 
        filter(comuna == .env$comuna)
    } else {
      # si comuna no es válida, error
      cli_abort("error: comuna incorrecta!") 
    }
    
  } else if (!is.null(provincia)) {
    # revisar si la provincia es válida
    if (provincia %in% unique(censo$provincia)) {
      cli_alert_info("datos nivel provincial: {provincia}")
      
      filtrado <- filtrado |> 
        filter(nivel == "Provincia") |> 
        filter(provincia == .env$provincia)
    } else {
      # si provincia no es válida, error
      cli_abort("error: provincia incorrecta!") 
    }
    
  } else if (!is.null(region)) {
    # revisar si la región es válida
    if (region %in% unique(censo$region)) {
      cli_alert_info("datos nivel regional: {region}")
      
      filtrado <- filtrado |> 
        filter(nivel == "Región") |> 
        filter(region == .env$region)
    } else {
      # si región no es válida, error
      cli_abort("error: región incorrecta!") 
    }
  }
  
  # mensajes
  cli_alert("edad: {edad}")
  cli_alert("sexo: {sexo}")
  
  # extraer valor
  poblacion <- filtrado |> pull(poblacion)
  
  # función de formateo
  cifra <- scales::label_comma(
    big.mark = '.', 
    decimal.mark = ',')
  
  # mensaje con resultado
  cli_alert_info(
    "población censada: {cifra(poblacion)}"
  )
  
  return(poblacion)
}
consultar_censo(
  comuna = "Cerrillos",
  sexo = "Mujeres",
  edad = "Total")
[1] 43825

Otra opción es que, si queremos que un modelo de lenguaje (LLM) use esta función, lo ideal es que entregue un resultado en formato JSON, un formato de texto que las IAs pueden entender fácilmente. Para eso podemos usar la función toJSON() del paquete {jsonlite}.

Conclusiones

Pasamos de tener que hacer esto:

censo |> 
  filter(nivel == "Región") |>
  filter(region == "Maule") |> 
  select(-provincia, -comuna) |> 
  filter(sexo == "Mujeres") |> 
  filter(edad == "30-34") |>
  select(poblacion) |> 
  pull()
[1] 43749

Y solo obtener un numerito, a poder hacer esto:

consultar_censo(
  region = "Maule",
  sexo = "Mujeres",
  edad = "30-34")
ℹ datos nivel regional: Maule

→ edad: 30-34

→ sexo: Mujeres

ℹ población censada: 43.749

[1] 43749

Ahora la función está lista para entregarla a una inteligencia artificial para que pueda hacer tool calling y responder basándose en datos exactos, o para empaquetar la función en una API y permitir que otros usuari@s extraigan datos, o que sean ingeridos por aplicaciones.


Si quieres ver una versión más completa de la misma función que vimos en este tutorial, y cómo se puede usar por medio de inteligencia artificial, revisa el siguiente tutorial:

Fecha de publicación:
May 23, 2026
Extensión:
19 minute read, 4021 words
Tags:
datos Chile funciones
Ver también:
Potencia las capacidades de la IA entregándole herramientas (_tool calling_) basadas en R
Aplicación: Visualizador de densidad de población urbana en comunas de Chile
Explorar datos del Censo de Población y Vivienda 2024 con R