Snippets

Código para copiar y pegar

Para que nadie se quede atrás, acá está el código de cada paso. Hacé clic en el ícono de copiar, arriba a la derecha de cada bloque.

Episodio 3: la primera función

R/dicho_al_azar.R

dicho_al_azar <- function() {
  dichos <- c(
    "Estoy al horno",
    "Mas perdido que perro en cancha de bochas",
    "Pasarlo chancho"
  )
  sample(dichos, size = 1)
}

Episodio 4: la documentación

#' Elegir un dicho al azar
#'
#' Devuelve un dicho popular de América Latina elegido al azar.
#'
#' @return Un texto (vector de caracteres de largo 1) con el dicho.
#' @export
#'
#' @examples
#' dicho_al_azar()

Episodio 5: los datos

Descargar el CSV:

download.file(
  "https://yabellini.github.io/desarrollo_paquetes/datos/dichos.csv",
  "data-raw/dichos.csv"
)

data-raw/dichos.R

## Código para preparar el conjunto de datos `dichos`

dichos <- read.csv("data-raw/dichos.csv", encoding = "UTF-8")

# Ordenamos por país para que sea más fácil de leer
dichos <- dichos[order(dichos$pais, dichos$dicho), ]
rownames(dichos) <- NULL

usethis::use_data(dichos, overwrite = TRUE)

R/data.R

#' Dichos y expresiones populares de América Latina
#'
#' Una colección de dichos, refranes y expresiones que se usan en distintos
#' países de América Latina, con su significado.
#'
#' @format Un data frame con 48 filas y 4 columnas:
#' \describe{
#'   \item{dicho}{El dicho o la expresión, como texto.}
#'   \item{significado}{Qué quiere decir, explicado en pocas palabras.}
#'   \item{pais}{País donde se usa. "Varios países" si se usa en muchos lugares.}
#'   \item{tema}{Tema del dicho: "dinero", "comida", "animales", etc.}
#' }
#' @source Recopilado para el taller de desarrollo de paquetes de LatinR 2026.
"dichos"

R/dicho_al_azar.R, versión con datos:

#' Elegir un dicho al azar
#'
#' Devuelve un dicho elegido al azar del conjunto de datos [dichos].
#' Podés elegir de qué país querés el dicho.
#'
#' @param pais Texto con el nombre de un país, por ejemplo `"Argentina"`.
#'   Si es `NULL` (el valor por defecto) se elige entre todos los países.
#'
#' @return Un texto (vector de caracteres de largo 1) con el dicho.
#' @export
#'
#' @examples
#' dicho_al_azar()
#' dicho_al_azar(pais = "Argentina")
dicho_al_azar <- function(pais = NULL) {
  opciones <- dichos

  if (!is.null(pais)) {
    opciones <- dichos[dichos$pais == pais, ]
  }

  fila <- sample(nrow(opciones), size = 1)
  opciones$dicho[fila]
}

Episodio 6: el error con cli

dicho_al_azar <- function(pais = NULL) {
  opciones <- dichos

  if (!is.null(pais)) {
    if (!pais %in% dichos$pais) {
      cli::cli_abort(c(
        "No tengo dichos de {.val {pais}}.",
        "i" = "Los pa\u00edses disponibles son: {.val {unique(dichos$pais)}}."
      ))
    }
    opciones <- dichos[dichos$pais == pais, ]
  }

  fila <- sample(nrow(opciones), size = 1)
  opciones$dicho[fila]
}

Episodio 7: los tests

tests/testthat/test-dicho_al_azar.R

test_that("dicho_al_azar() devuelve un solo texto", {
  resultado <- dicho_al_azar()
  expect_type(resultado, "character")
  expect_length(resultado, 1)
})

test_that("dicho_al_azar() respeta el país", {
  resultado <- dicho_al_azar(pais = "Chile")
  expect_true(resultado %in% dichos$dicho[dichos$pais == "Chile"])
})

test_that("dicho_al_azar() avisa si no conoce el país", {
  expect_error(dicho_al_azar(pais = "Narnia"), "Narnia")
  expect_snapshot(dicho_al_azar(pais = "Narnia"), error = TRUE)
})

Extra: dicho_del_dia()

Una función que siempre da el mismo dicho para la misma fecha. Más sencillo de testear, porque no es al azar.

R/dicho_del_dia.R

#' El dicho del día
#'
#' Devuelve siempre el mismo dicho para una misma fecha. Ideal para
#' empezar la mañana (o una clase).
#'
#' @param fecha Una fecha (objeto de clase `Date`). Por defecto, hoy.
#'
#' @return Un texto con el dicho y su significado.
#' @export
#'
#' @examples
#' dicho_del_dia()
#' dicho_del_dia(as.Date("2026-12-03"))
dicho_del_dia <- function(fecha = Sys.Date()) {
  if (!inherits(fecha, "Date")) {
    cli::cli_abort(c(
      "{.arg fecha} tiene que ser una fecha.",
      "x" = "Recib\u00ed un objeto de clase {.cls {class(fecha)}}.",
      "i" = "Prob\u00e1 con {.code as.Date(\"2026-12-03\")}."
    ))
  }

  fila <- as.integer(fecha) %% nrow(dichos) + 1
  paste0(dichos$dicho[fila], ": ", dichos$significado[fila])
}

tests/testthat/test-dicho_del_dia.R

test_that("dicho_del_dia() da el mismo dicho para la misma fecha", {
  fecha <- as.Date("2026-12-03")
  expect_equal(dicho_del_dia(fecha), dicho_del_dia(fecha))
})

test_that("dicho_del_dia() cambia de un día al otro", {
  expect_false(
    dicho_del_dia(as.Date("2026-12-03")) == dicho_del_dia(as.Date("2026-12-04"))
  )
})

test_that("dicho_del_dia() pide una fecha", {
  expect_error(dicho_del_dia("hoy"), class = "rlang_error")
})

Extra: buscar_dicho()

R/buscar_dicho.R

#' Buscar dichos por palabra
#'
#' Busca una palabra en los dichos y en sus significados.
#'
#' @param palabra Texto a buscar. No distingue mayúsculas de minúsculas.
#'
#' @return Un data frame con las filas de [dichos] que contienen la palabra.
#'   Si no encuentra nada, devuelve un data frame sin filas y avisa con un
#'   mensaje.
#' @export
#'
#' @examples
#' buscar_dicho("dinero")
#' buscar_dicho("perro")
buscar_dicho <- function(palabra) {
  if (!is.character(palabra) || length(palabra) != 1) {
    cli::cli_abort("{.arg palabra} tiene que ser un solo texto.")
  }

  encontrados <- grepl(palabra, dichos$dicho, ignore.case = TRUE) |
    grepl(palabra, dichos$significado, ignore.case = TRUE)

  if (!any(encontrados)) {
    cli::cli_inform(c("!" = "No encontr\u00e9 dichos con {.val {palabra}}."))
  }

  dichos[encontrados, ]
}

Episodio 9: un pedido para un asistente de IA

Para probar con el chat de GitHub Copilot en https://github.com/copilot (gratis con tu cuenta de GitHub) o con otro asistente. Si usás Copilot en el navegador, elegí primero el repositorio de tu paquete para que pueda leerlo.

Agregá a dichosos la función `dichos_por_tema(tema)` en `R/dichos_por_tema.R`.
Usá R base, sin dependencias nuevas.
Si el tema no existe, dá un error con `cli::cli_abort()` que liste los temas disponibles, como en `dicho_al_azar()`.
Documentala con roxygen2 y exportala.
Escribí tests cortos en `tests/testthat/test-dichos_por_tema.R`.
Antes de escribir código, mostrame un plan.

Después: leé el plan, pedile el código, copialo a tu paquete, revisá los cambios con Git, probá la función con load_all() y corré devtools::check(). Y si compartís el resultado, contá que usaste IA.