<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Optimización on Bastián Olea</title>
    <link>https://bastianolea.rbind.io/tags/optimizaci%C3%B3n/</link>
    <description>Recent content in Optimización on Bastián Olea</description>
    <generator>Hugo</generator>
    <language>es-ES</language>
    <lastBuildDate>Wed, 18 Feb 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://bastianolea.rbind.io/tags/optimizaci%C3%B3n/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cómo dejar de repetirte y escribir código más eficiente en R</title>
      <link>https://bastianolea.rbind.io/blog/repetirse/</link>
      <pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/repetirse/</guid>
      <description>&lt;p&gt;El otro día me llegó un script (muy probablemente hecho por una IA) de más de 9.000 líneas!&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://bastianolea.rbind.io/blog/repetirse/script.mov&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Igual era entendible, porque era un script que producía cientos de gráficos. Pero revisando el script me doy cuenta de que también &lt;strong&gt;se repiten cientos de veces los mismos patrones de código.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Scripts como éstos suelen ser apenas una docena de bloques de código distintos, pero repetidos muchas veces cada uno con mínimas diferencias entre ellos: referencias a columnas distintas, etc.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Desplegar aplicaciones Shiny a producción en contenedores Docker</title>
      <link>https://bastianolea.rbind.io/blog/shiny_docker/</link>
      <pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/shiny_docker/</guid>
      <description>&lt;p&gt;Docker es una plataforma que permite empaquetar aplicaciones y sus dependencias en &lt;strong&gt;contenedores&lt;/strong&gt;, lo que simplifica el proceso de despliegue (&lt;em&gt;deployment&lt;/em&gt;) y gestión de aplicaciones.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;div style=&#34;display: flex; align-items: center; gap: 15px; padding: 14px; &#xA;            background-color: #493365;&#xA;            border-radius: 6px;&#xA;            margin: 20px 40px 20px 40px;&#34;&gt;&#xA;  &#xA;  &lt;div style=&#34;flex-shrink: 0;&#34;&gt;&#xA;    &lt;i class=&#34;fas fa-triangle-exclamation&#34; style=&#34;font-size: 130%; margin-left: 2px; opacity: 1; color: #EAD2FA;&#34;&gt;&lt;/i&gt;&#xA;  &lt;/div&gt;&#xA;  &#xA;  &lt;aside style = &#34;font-size: 90%; color: #EAD2FA;&#34;&gt;&#xA;    Post en construcción! A medida que voy aprendiendo iré complementando la publicación.&#xA;  &lt;/aside&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&lt;div style=&#34;display: flex; align-items: center; gap: 15px; padding: 14px; &#xA;            /*background-color: #A985C650;*/&#xA;            background-color: #DEC4F2;&#xA;            border-radius: 6px;&#xA;            margin: 20px 40px 20px 40px;&#34;&gt;&#xA;  &#xA;  &lt;div style=&#34;flex-shrink: 0;&#34;&gt;&#xA;    &lt;i class=&#34;fas fa-info-circle&#34; style=&#34;font-size: 130%; margin-left: 2px; opacity: 1; color: #9069C0;&#34;&gt;&lt;/i&gt;&#xA;  &lt;/div&gt;&#xA;  &#xA;  &lt;aside style = &#34;font-size: 90%;&#34;&gt;&#xA;    Este es un post para usuarios avanzados de Shiny que necesiten desplegar sus apps contextos de empresas o producción. Si eres un usuario casual de Shiny, probablemente sea mejor usar &#xA;&lt;a href=&#34;https://connect.posit.cloud&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Posit Connect Cloud&lt;/a&gt; para publicar tus apps.&#xA;  &lt;/aside&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&lt;div style=&#34;margin: 28px 0;&#34;&gt;&#xA;    &lt;p class=&#34;titulo-panel&#34;&gt;&#xA;      Publicaciones relacionadas&#xA;    &lt;/p&gt;</description>
    </item>
    <item>
      <title>Analiza el funcionamiento de tus aplicaciones Shiny con `{reactlog}`</title>
      <link>https://bastianolea.rbind.io/blog/shiny_reactlog/</link>
      <pubDate>Fri, 14 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/shiny_reactlog/</guid>
      <description>&lt;p&gt;Las aplicaciones Shiny funcionan con &lt;strong&gt;&#xA;&lt;a href=&#34;https://shiny.posit.co/r/articles/build/reactivity-overview/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;reactividad&lt;/a&gt;&lt;/strong&gt;: una cadena de causalidad que va desde los &lt;em&gt;inputs&lt;/em&gt; de tu app, pasando por las expresiones reactivas (objetos de R que se actualizan automáticamente cuando cambian sus dependencias), hasta los &lt;em&gt;outputs&lt;/em&gt; que se muestran en la interfaz de usuario.&lt;/p&gt;&#xA;&lt;a href=&#34;shiny_esquema.png&#34; target=&#34;_blank&#34;&gt;&#xA;&#xA;  &lt;img src=&#34;shiny_esquema.png&#34; style=&#34;border-radius: 5px; width: 80%; max-width: 700px; display: block; margin: auto; margin-bottom: 8px; margin-top: 8px;&#34;&gt;&#xA;  &#xA;&lt;/a&gt;&#xA;&lt;p&gt;Cuando programamos una app Shiny vamos haciendo éste tipo de &lt;strong&gt;conexiones&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;estos dos &lt;em&gt;inputs&lt;/em&gt; van a hacer que en este &lt;code&gt;reactive()&lt;/code&gt; se filtren los datos, y el resultado del &lt;code&gt;reactive()&lt;/code&gt; va a usarse para generar un &lt;em&gt;output&lt;/em&gt; en forma de gráfico.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Crear y conectarse a una base de datos en R</title>
      <link>https://bastianolea.rbind.io/blog/db_supabase/</link>
      <pubDate>Thu, 06 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/db_supabase/</guid>
      <description>&lt;div style = &#34;margin-left: -16px;&#34;&gt;&#xA;  &#xA;  &lt;details closed id=&#34;PageTableOfContents&#34;&gt;&#xA;    &lt;summary&gt;&#xA;      &lt;h2 class=&#34;mv0 f5 fw7 ttu tracked dib&#34; style = &#34;margin-left: 6px; font-size: 120%;&#34;&gt;Índice&lt;/h2&gt;&#xA;      &lt;/summary&gt;&#xA;    &lt;div class=&#34;pl2 pr0 mh0&#34; style = &#34;font-size: 90%; margin-top: -8px; margin-left: 16px; margin-bottom: 32px;&#34;&gt;&#xA;    &lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ul&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#qué-es-una-base-de-datos&#34;&gt;Qué es una base de datos&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#cuándo-usar-una-base-de-datos&#34;&gt;Cuándo usar una base de datos&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#crear-una-base-de-datos-en-supabase&#34;&gt;Crear una base de datos en Supabase&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#conectarse-a-la-base-de-datos&#34;&gt;Conectarse a la base de datos&lt;/a&gt;&#xA;      &lt;ul&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#credenciales-de-acceso&#34;&gt;Credenciales de acceso&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#variables-de-entorno&#34;&gt;Variables de entorno&lt;/a&gt;&lt;/li&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#conexión-a-la-base-de-datos&#34;&gt;Conexión a la base de datos&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ul&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#crear-una-tabla-en-la-base-de-datos&#34;&gt;Crear una tabla en la base de datos&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#leer-una-tabla-desde-la-base-de-datos&#34;&gt;Leer una tabla desde la base de datos&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#procesar-desde-la-base-de-datos-con-dplyr&#34;&gt;Procesar desde la base de datos con &lt;code&gt;{dplyr}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#avanzado&#34;&gt;Avanzado&lt;/a&gt;&#xA;      &lt;ul&gt;&#xA;        &lt;li&gt;&lt;a href=&#34;#conexión-por-ipv4&#34;&gt;Conexión por IPv4&lt;/a&gt;&lt;/li&gt;&#xA;      &lt;/ul&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#recursos&#34;&gt;Recursos&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ul&gt;&#xA;&lt;/nav&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/details&gt;&#xA;  &#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;h2 id=&#34;qué-es-una-base-de-datos&#34;&gt;Qué es una base de datos&#xA;  &lt;a href=&#34;#qu%c3%a9-es-una-base-de-datos&#34;&gt;&lt;svg class=&#34;anchor-symbol&#34; aria-hidden=&#34;true&#34; height=&#34;26&#34; width=&#34;26&#34; viewBox=&#34;0 0 22 22&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&#xA;      &lt;path d=&#34;M0 0h24v24H0z&#34; fill=&#34;currentColor&#34;&gt;&lt;/path&gt;&#xA;      &lt;path d=&#34;M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76.0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71.0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71.0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76.0 5-2.24 5-5s-2.24-5-5-5z&#34;&gt;&lt;/path&gt;&#xA;    &lt;/svg&gt;&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Cuando se habla de datos, mucha gente (me incluyo) usa coloquialmente el término &lt;em&gt;base de datos&lt;/em&gt; para referirse a datos que están en Excel o &lt;code&gt;csv&lt;/code&gt; 😣 Pero la realidad es que una base de datos es algo distinto: un &lt;strong&gt;sistema de almacenamiento y procesamiento de datos&lt;/strong&gt; que puede contener múltiples tablas, que está &lt;em&gt;hosteado&lt;/em&gt; en un computador, servidor o en la nube, y que entrega datos de acuerdo a las solicitudes que se le hagan. En este sentido &lt;strong&gt;una base de datos es distinto a &lt;em&gt;leer&lt;/em&gt; un archivo&lt;/strong&gt;, porque la base de datos siempre tiene &lt;em&gt;cargados&lt;/em&gt; los datos, y está esperando que se los pidan para entregarlos de manera optimizada.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Optimiza la velocidad de tus aplicaciones Shiny con `bindCache()`</title>
      <link>https://bastianolea.rbind.io/blog/shiny_optimizar/</link>
      <pubDate>Tue, 04 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/shiny_optimizar/</guid>
      <description>&lt;a href=&#34;shiny_esquema_3.png&#34; target=&#34;_blank&#34;&gt;&#xA;&#xA;  &lt;img src=&#34;shiny_esquema_3.png&#34; style=&#34;border-radius: 5px; width: 80%; max-width: 700px; display: block; margin: auto; margin-bottom: 8px; margin-top: 8px;&#34;&gt;&#xA;  &#xA;&lt;/a&gt;&#xA;&lt;p&gt;En una aplicación Shiny, cada interacción que la/el usuario hace suele conllevar un &lt;strong&gt;cálculo&lt;/strong&gt; de R que se ejecuta para producir un &lt;em&gt;output&lt;/em&gt;, como una tabla o un gráfico. Dependiendo de la cantidad de datos, de la complejidad del cálculo o del &lt;em&gt;output&lt;/em&gt;, estas interacciones pueden tomar más tiempo del esperado.&lt;/p&gt;&#xA;&lt;div style=&#34;margin: 28px 0;&#34;&gt;&#xA;    &lt;p class=&#34;titulo-panel&#34;&gt;&#xA;      Publicaciones relacionadas&#xA;    &lt;/p&gt;&#xA;&#xA;  &lt;a href=&#34;https://bastianolea.rbind.io/blog/shiny/&#34;&#xA;     style=&#34;display: flex;&#xA;            flex-direction: row;&#xA;            align-items: stretch;&#xA;            text-decoration: none;&#xA;            color: inherit;&#xA;            /*border: 1px solid #9069C035;*/&#xA;            border: solid 2px #A885C6AA;&#xA;            border-radius: 8px;&#xA;            overflow: hidden;&#xA;            /*background-color: #9069C00d;*/&#xA;            background-color: #9069C020;&#xA;            &#34;&gt;&#xA;&#xA;    &#xA;    &lt;figure style=&#34;flex-shrink: 0;&#xA;                   position: relative;&#xA;                   width: 140px;&#xA;                   min-height: 80px;&#xA;                   margin: 10px 0 10px 10px;&#xA;                   overflow: hidden;&#xA;                   border-radius: 5px;&#34;&gt;&#xA;      &lt;img src=&#34;https://bastianolea.rbind.io/blog/shiny/shiny-apps-featured.jpg&#34;&#xA;           alt=&#34;Tutorial: Crea aplicaciones web interactivas en R con Shiny&#34;&#xA;           style=&#34;position: absolute;&#xA;                  inset: 0;&#xA;                  width: 100%;&#xA;                  height: 100%;&#xA;                  object-fit: cover;&#xA;                  object-position: center top;&#xA;                  margin: 0;&#34;&gt;&#xA;    &lt;/figure&gt;&#xA;    &#xA;&#xA;    &lt;div style=&#34;padding: 15px 20px;&#xA;                flex: 1;&#xA;                display: flex;&#xA;                flex-direction: column;&#xA;                justify-content: center;&#xA;                gap: 6px;&#34;&gt;&#xA;&#xA;      &lt;p style=&#34;margin: 0;&#xA;                font-size: 95%;&#xA;                color: #9069C0;&#xA;                font-weight: bold;&#xA;                line-height: 1.35;&#34;&gt;&#xA;        Tutorial: Crea aplicaciones web interactivas en R con Shiny&#xA;      &lt;/p&gt;</description>
    </item>
    <item>
      <title>Generar múltiples gráficos automáticamente con R</title>
      <link>https://bastianolea.rbind.io/blog/ggplot_purrr/</link>
      <pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/ggplot_purrr/</guid>
      <description>&lt;p&gt;Uno de los principales beneficios del análisis de datos en base a programación es que &lt;strong&gt;el código es reutilizable.&lt;/strong&gt; Esto significa que cualquier cosa que hayas hecho puedes &lt;strong&gt;reutilizarla&lt;/strong&gt;, y así ahorrar trabajo. El siguiente paso es reutilizar el código de tal forma que sirva para aplicarlo a varios casos a la vez, incluso cientos o miles de veces.&lt;/p&gt;&#xA;&lt;p&gt;La reutilización de código es súper conveniente para la visualización de datos: una vez que diseñaste un gráfico, con muy pocas modificaciones puedes adaptarlo para que funcione con una fuente de datos distintas, una fuente actualizada, o para que visualice distintas variables.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Procesamiento de datos multiprocesador en R con {furrr}</title>
      <link>https://bastianolea.rbind.io/blog/furrr_multiprocesador/</link>
      <pubDate>Thu, 12 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/furrr_multiprocesador/</guid>
      <description>&lt;p&gt;La mayoría de las funciones de R, así como R mismo, se ejecutan en un único proceso dentro de tu computadora, dado que R es un software de un sólo hilo (&lt;em&gt;single threaded&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Los computadores modernos en general tienen entre 2 y 8 núcleos (&lt;em&gt;cores&lt;/em&gt;), algunos incluso muchos más. Una mayor cantidad de núcleos o procesadores permite a tu computadora hacer más &lt;strong&gt;operaciones paralelas&lt;/strong&gt;. Por ejemplo, si tu computador tiene 6 núcleos y R está procesando datos, R usará 1 núcleo al 100%, y te quedarán 5 núcleos en desuso, que podrían estar ejecutando otras tareas. En otras palabras, R está usando sólo el 100% de tu computador, cuando podría estar usando el 600%.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cargar archivos csv más rápido en R con Arrow</title>
      <link>https://bastianolea.rbind.io/blog/2025-02-12/</link>
      <pubDate>Wed, 12 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/2025-02-12/</guid>
      <description>&lt;p&gt;Los archivos &lt;code&gt;csv&lt;/code&gt; (&lt;em&gt;comma-separated values,&lt;/em&gt; valores separados por comas) suelen ser el formato más básico para guardar datos. Los beneficios que tienen los csv con respecto a compatibilidad y accesibilidad son a su vez la causa de sus desventajas: son más pesados porque sus datos no se guardan comprimidos, y suelen ser &lt;strong&gt;más lentos de cargar&lt;/strong&gt;, porque los datos no vienen codificados de una forma optimizada.&lt;/p&gt;&#xA;&lt;p&gt;Sin embargo, usualmente grandes bases de datos son guardadas en archivos csv, con varios millones de filas, lo que puede hacer que la carga de un archivo dure entre varios segundos a &lt;strong&gt;minutos&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Haciendo que un loop muy largo termine sin cancelarlo</title>
      <link>https://bastianolea.rbind.io/blog/2024-12-26/</link>
      <pubDate>Thu, 26 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/2024-12-26/</guid>
      <description>&lt;p&gt;Me encuentro en la tarea de tener que &#xA;&lt;a href=&#34;https://bastianolea.rbind.io/blog/2024-12-20/&#34;&gt;procesar cientos de miles de datos&lt;/a&gt;, lo cual demorará varios cientos de horas, por lo que necesito que dejar mi computador trabajando durante las noches, por varios días. La idea es que, cada noche, el computador procese de la mayor cantidad de datos posibles, los resultados se guarden, y a la siguiente noche el proceso se repita con datos nuevos, hasta que en algunos días logre procesar todos los cientos de miles de datos que necesito.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comparar el rendimiento expresiones en R</title>
      <link>https://bastianolea.rbind.io/blog/benchmark_ejemplo/</link>
      <pubDate>Tue, 05 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://bastianolea.rbind.io/blog/benchmark_ejemplo/</guid>
      <description>&lt;p&gt;Al programar algo, siempre existen varias formas de lograr un mismo objetivo. Un criterio para elegir una forma por sobre otra puede ser el rendimiento: si hay dos formas de hacer algo, elegir la forma que se ejecute más rápido.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Para comparar el rendimiento de distintas expresiones en R, realizamos un &lt;em&gt;benchmark,&lt;/em&gt; al cual le entregamos las expresiones que queremos comparar, y nos entregará un detalle de su velocidad de ejecución, consumo de memoria, y otros.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
