<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>%&gt;% dreams</title>
<link>https://ivelasq.rbind.io/talk.html</link>
<atom:link href="https://ivelasq.rbind.io/talk.xml" rel="self" type="application/rss+xml"/>
<description>Isabella Velásquez Personal Website</description>
<generator>quarto-1.9.38</generator>
<lastBuildDate>Tue, 16 Jun 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Skills 101</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/skills-101/</link>
  <description><![CDATA[ 




<a href="https://rinpharma.com/docs/ai-day/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://pos.it/skills-101" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://youtu.be/MphOm5LDhi8?si=waGpZ3QEoAvzmMKB" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>  
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://rinpharma.com/docs/ai-day/">2026 R/Pharma GenAI Day</a>
</li>
<li>
📆 16 June 2026 // 11:20 AM ET
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Throughout this conference, you’re going to hear the word “skill” a lot. These specifically mean “agent skills”, specialized tools and behaviors passed to large language models to make them actionable. If you’ve found yourself wondering, “What actually is a skill?”” then join us for Skills 101. We’ll break down what they are, what they are not, and how they work, giving you the foundational toolkit to navigate the rest of the conference.</p>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<iframe width="800" height="415" src="https://www.youtube.com/embed/MphOm5LDhi8?si=6eZqkZytik2HVR4t" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/skills-101/</guid>
  <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/skills-101/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Connecting Python with LLMs</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/connecting-python-with-llms/</link>
  <description><![CDATA[ 




<a href="https://www.linkedin.com/in/pyladies-monterrey-3ab6061b8/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://019e0d75-ef39-43e7-55c0-dabb66e317bd.share.connect.posit.cloud/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/2026-05-09_connecting-python-with-llms" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.linkedin.com/in/pyladies-monterrey-3ab6061b8/">PyLadies Monterrey</a>
</li>
<li>
📆 09 May 2026 // 12:30 PM CST
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Large language models (LLMs) like ChatGPT and Claude have become powerful tools for everyday work, but using them through a browser interface is just the beginning. This talk explores how to connect Python code directly to LLMs using <a href="https://posit-dev.github.io/chatlas/">chatlas</a>, a lightweight library that makes LLM integration straightforward and flexible.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://019e0d75-ef39-43e7-55c0-dabb66e317bd.share.connect.posit.cloud/#/title-slide" height="415" width="800">
</iframe>
</section>
<section id="summary" class="level2">
<h2 class="anchored" data-anchor-id="summary">Summary</h2>
<div class="tabset-margin-container"></div><div class="panel-tabset">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">Español</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">English</a></li></ul>
<div class="tab-content">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<p><em>Este resumen fue generado por Claude Sonnet 4.6 y revisado por mí.</em></p>
<section id="qué-son-los-modelos-de-lenguaje-grandes" class="level4">
<h4 class="anchored" data-anchor-id="qué-son-los-modelos-de-lenguaje-grandes">¿Qué son los modelos de lenguaje grandes?</h4>
<p>Los LLMs son modelos de IA entrenados con cantidades masivas de texto — libros, sitios web, código — que pueden entender y generar texto similar al humano. Impulsan herramientas que la mayoría de nosotros ya usamos: ChatGPT, Claude, Gemini. Pero usarlos a través de un navegador es solo el comienzo.</p>
<blockquote class="blockquote">
<p><em>“Hoy iremos más allá de la interfaz web y aprenderemos cómo integrar estos modelos directamente en tu código Python. Esto abre posibilidades para la automatización, flujos de trabajo personalizados y la creación de tus propias herramientas impulsadas por IA.”</em></p>
</blockquote>
</section>
<section id="interactuando-con-llms-usando-chatlas" class="level4">
<h4 class="anchored" data-anchor-id="interactuando-con-llms-usando-chatlas">Interactuando con LLMs usando chatlas</h4>
<p>Hay varias formas de trabajar con LLMs en Python de forma programática: SDKs de proveedores (OpenAI, Anthropic, Google), o frameworks como LangChain, LlamaIndex y Haystack. <a href="https://posit-dev.github.io/chatlas/">chatlas</a> busca un punto intermedio: lo suficientemente simple para comenzar rápidamente, pero lo suficientemente flexible para aplicaciones reales.</p>
<blockquote class="blockquote">
<p><em>“chatlas fue diseñado para hacer que la integración con LLMs sea sencilla. No necesitas aprender abstracciones complejas ni navegar por archivos de configuración. Maneja tareas comunes como el historial de conversación automáticamente, mientras te da acceso a funciones avanzadas cuando las necesites.”</em></p>
</blockquote>
<p>Comenzar toma tres líneas:<sup>1</sup></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> chatlas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ChatOllama</span>
<span id="cb1-2"></span>
<span id="cb1-3">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3"</span>)</span>
<span id="cb1-4"></span>
<span id="cb1-5">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Tell me something about Monterrey, Mexico."</span>)</span></code></pre></div></div>
<p>También puedes agregar un system prompt para controlar el comportamiento del modelo — por ejemplo, restringirlo a respuestas en español de no más de tres oraciones:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3"</span>,</span>
<span id="cb2-2">                  system_prompt<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Reply in Spanish using at most three sentences."</span>)</span>
<span id="cb2-3"></span>
<span id="cb2-4">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Tell me something about Monterrey, Mexico."</span>)</span></code></pre></div></div>
<p>chatlas funciona en la consola de Python para experimentación rápida, en scripts para automatización, y en notebooks de Jupyter para trabajo exploratorio.</p>
</section>
<section id="proveedores-y-modelos" class="level4">
<h4 class="anchored" data-anchor-id="proveedores-y-modelos">Proveedores y modelos</h4>
<p>Un <strong>proveedor</strong> es una empresa que aloja y sirve modelos (OpenAI, Anthropic, Google). Un <strong>modelo</strong> es el LLM específico que estás usando (GPT-4, Claude, Gemini). Los modelos se diferencian en varias dimensiones:</p>
<ol type="1">
<li><strong>Contexto</strong> — ¿cuántos tokens puedes darle al modelo?</li>
<li><strong>Velocidad</strong> — ¿cuántos tokens por segundo?</li>
<li><strong>Costo</strong> — ¿cuánto por millón de tokens?</li>
<li><strong>Inteligencia</strong> — capacidad de razonamiento y precisión</li>
<li><strong>Capacidades</strong> — visión, llamada de herramientas, salida estructurada, etc.</li>
</ol>
<p>chatlas soporta APIs comerciales, modelos locales vía Ollama, y servicios empresariales como Bedrock. Lo más importante: cambiar de proveedor solo requiere cambiar la importación (<code>ChatOllama</code> vs <code>ChatAnthropic</code>) y el modelo (<code>gemma3</code> vs <code>claude-sonnet-4-6</code>) — el resto de tu código permanece prácticamente igual:<sup>2</sup></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> chatlas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ChatOllama</span>
<span id="cb3-2">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3"</span>)</span>
<span id="cb3-3"></span>
<span id="cb3-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># or</span></span>
<span id="cb3-5"></span>
<span id="cb3-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> chatlas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ChatAnthropic</span>
<span id="cb3-7">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatAnthropic(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"claude-sonnet-4-6"</span>,</span>
<span id="cb3-8">                     api_key<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>os.getenv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ANTHROPIC_API_KEY"</span>))</span></code></pre></div></div>
<blockquote class="blockquote">
<p><em>“Esta flexibilidad significa que puedes comenzar con un proveedor y cambiar a otro sin reescribir tu código.”</em></p>
</blockquote>
</section>
<section id="llamada-de-herramientas-tool-calling" class="level4">
<h4 class="anchored" data-anchor-id="llamada-de-herramientas-tool-calling">Llamada de herramientas (tool calling)</h4>
<p>Por defecto, los LLMs no tienen acceso a datos en tiempo real. Pregúntales sobre el clima y obtendrás información general — no el pronóstico de hoy. La llamada de herramientas soluciona esto permitiendo que el modelo llame a tus funciones de Python.</p>
<p>La clave es el docstring: le dice al modelo qué hace la función y qué parámetros necesita. chatlas lo convierte automáticamente a un formato que el modelo entiende.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> requests</span>
<span id="cb4-2"></span>
<span id="cb4-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> get_current_weather(lat: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, lng: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>):</span>
<span id="cb4-4">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb4-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    Get the current weather given a latitude and longitude.</span></span>
<span id="cb4-6"></span>
<span id="cb4-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    Parameters</span></span>
<span id="cb4-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    ----------</span></span>
<span id="cb4-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    lat: The latitude of the location.</span></span>
<span id="cb4-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    lng: The longitude of the location.</span></span>
<span id="cb4-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    """</span></span>
<span id="cb4-12">    lat_lng <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"latitude=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>lat<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">&amp;longitude=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>lng<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb4-13">    url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"https://api.open-meteo.com/v1/forecast?</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>lat_lng<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">&amp;current=temperature_2m,wind_speed_10m"</span></span>
<span id="cb4-14">    response <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> requests.get(url)</span>
<span id="cb4-15">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> response.json()[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"current"</span>]</span>
<span id="cb4-16"></span>
<span id="cb4-17">chat.register_tool(get_current_weather)</span>
<span id="cb4-18">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"How's the weather in Monterrey, Mexico?"</span>)</span></code></pre></div></div>
<p>Una vez registrada, el modelo reconoce cuándo necesita datos del clima, llama a la función con las coordenadas correctas, e integra el resultado en una respuesta natural:</p>
<pre><code># 🔧 tool request
 get_current_weather(lat=25.6866, lng=-100.3161)

# ✅ tool result
 {'temperature_2m': 23.1, 'wind_speed_10m': 4.5}

The current weather in Monterrey is 23.1°C with light winds of 4.5 km/h.</code></pre>
<blockquote class="blockquote">
<p><em>“Este es el poder de la llamada de herramientas — tu LLM ahora puede interactuar con cualquier API o fuente de datos que le proporciones.”</em></p>
</blockquote>
</section>
<section id="entrada-multimodal" class="level4">
<h4 class="anchored" data-anchor-id="entrada-multimodal">Entrada multimodal</h4>
<p>chatlas puede manejar más que solo texto. Pásale un archivo de imagen y hazle preguntas sobre él:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3"</span>)</span>
<span id="cb6-2"></span>
<span id="cb6-3">chat.chat(</span>
<span id="cb6-4">    chatlas.content_image_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"./images/View_of_Monterrey.jpg"</span>),</span>
<span id="cb6-5">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Can you explain this image? Be concise."</span></span>
<span id="cb6-6">)</span></code></pre></div></div>
<p>Los PDFs funcionan de la misma manera — útil para procesar artículos de investigación, informes o facturas:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatAnthropic(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"claude-sonnet-4-6"</span>,</span>
<span id="cb7-2">                     api_key<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>os.getenv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ANTHROPIC_API_KEY"</span>))</span>
<span id="cb7-3"></span>
<span id="cb7-4">chat.chat(</span>
<span id="cb7-5">    chatlas.content_pdf_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"./images/data-projects-in-monterrey-mexico.pdf"</span>),</span>
<span id="cb7-6">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"What are the main findings? Be concise."</span></span>
<span id="cb7-7">)</span></code></pre></div></div>
<p>No todos los modelos soportan todos los tipos de entrada, así que vale la pena revisar la documentación del proveedor — pero los modelos con capacidad de visión y de documentos son cada vez más comunes.</p>
</section>
<section id="streaming-e-historial-de-chat" class="level4">
<h4 class="anchored" data-anchor-id="streaming-e-historial-de-chat">Streaming e historial de chat</h4>
<p>El streaming devuelve respuestas fragmento a fragmento a medida que se generan, lo que crea una experiencia más fluida:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1">stream <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chat.stream(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"My name is Isabella."</span>)</span>
<span id="cb8-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> chunk <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> stream:</span>
<span id="cb8-3">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(chunk)</span></code></pre></div></div>
<p>El historial de chat se mantiene automáticamente. Más tarde en la misma sesión:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"What's my name?"</span>)</span>
<span id="cb9-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># → Your name is Isabella!</span></span></code></pre></div></div>
<blockquote class="blockquote">
<p><em>“No necesitas gestionar el contexto manualmente — simplemente funciona. Esto hace que construir aplicaciones conversacionales sea mucho más simple.”</em></p>
</blockquote>
<p>Juntos, el streaming y el historial de chat persistente son la base de cualquier chatbot.</p>
</section>
<section id="ejemplos-prácticos" class="level4">
<h4 class="anchored" data-anchor-id="ejemplos-prácticos">Ejemplos prácticos</h4>
<section id="resumen-de-documentos-en-lote" class="level5">
<h5 class="anchored" data-anchor-id="resumen-de-documentos-en-lote">Resumen de documentos en lote</h5>
<p>Define los campos que quieres con un modelo de Pydantic, recorre una carpeta de PDFs, y guarda los resultados como un CSV:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> pathlib <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Path</span>
<span id="cb10-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> pydantic <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> BaseModel</span>
<span id="cb10-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb10-4"></span>
<span id="cb10-5">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatGoogle(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemini-1.5-flash"</span>)</span>
<span id="cb10-6"></span>
<span id="cb10-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">class</span> Paper(BaseModel):</span>
<span id="cb10-8">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Extract key information from this research paper."""</span></span>
<span id="cb10-9">    title: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span></span>
<span id="cb10-10">    authors: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>[<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>]</span>
<span id="cb10-11">    year: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span></span>
<span id="cb10-12">    key_findings: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1-2 sentences</span></span>
<span id="cb10-13"></span>
<span id="cb10-14">papers <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb10-15"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> pdf_path <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> Path(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"research_papers/"</span>).glob(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"*.pdf"</span>):</span>
<span id="cb10-16">    result <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chat.chat_structured(</span>
<span id="cb10-17">        chatlas.content_pdf_file(pdf_path), data_model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>Paper</span>
<span id="cb10-18">    )</span>
<span id="cb10-19">    papers.append(result.model_dump())</span>
<span id="cb10-20"></span>
<span id="cb10-21">pd.DataFrame(papers).to_csv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"paper_summaries.csv"</span>, index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span></code></pre></div></div>
<blockquote class="blockquote">
<p><em>“Algo que tomaría horas de trabajo manual se convierte en un script corto que se ejecuta en minutos.”</em></p>
</blockquote>
</section>
<section id="construyendo-un-chatbot-con-shiny" class="level5">
<h5 class="anchored" data-anchor-id="construyendo-un-chatbot-con-shiny">Construyendo un chatbot con Shiny</h5>
<p>chatlas se integra directamente con <a href="https://shiny.posit.co/py/">Shiny for Python</a>. Shiny proporciona la interfaz de chat; chatlas se encarga del LLM:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb11-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> chatlas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ChatOllama</span>
<span id="cb11-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> shiny.express <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ui</span>
<span id="cb11-3"></span>
<span id="cb11-4">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ui.Chat(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">id</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ui_chat"</span>)</span>
<span id="cb11-5">chat.ui()</span>
<span id="cb11-6"></span>
<span id="cb11-7">chat_model <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3:1b"</span>)</span>
<span id="cb11-8"></span>
<span id="cb11-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@chat.on_user_submit</span></span>
<span id="cb11-10"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">async</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> handle_user_input():</span>
<span id="cb11-11">    response <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chat_model.stream(chat.user_input())</span>
<span id="cb11-12">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> chat.append_message_stream(response)</span></code></pre></div></div>
</section>
<section id="conectando-un-chatbot-a-tus-propios-datos" class="level5">
<h5 class="anchored" data-anchor-id="conectando-un-chatbot-a-tus-propios-datos">Conectando un chatbot a tus propios datos</h5>
<p>Los chatbots genéricos (ChatGPT, Claude) no pueden responder preguntas sobre los datos de tu organización. Con chatlas puedes registrar herramientas que consulten tus bases de datos locales, registros de eventos o APIs internas:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb12-1">EVENTS <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb12-2">    {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Python &amp; LLMs Workshop"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-05-09"</span>,</span>
<span id="cb12-3">     <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"location"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEC de Monterrey"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"attendees"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">45</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"topic"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"chatlas and AI"</span>},</span>
<span id="cb12-4">]</span>
<span id="cb12-5"></span>
<span id="cb12-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> get_upcoming_events(topic: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>):</span>
<span id="cb12-7">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Get upcoming PyLadies Monterrey events, optionally filtered by topic."""</span></span>
<span id="cb12-8">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [e <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> e <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> EVENTS <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> topic.lower() <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> e[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"topic"</span>].lower()]</span>
<span id="cb12-9"></span>
<span id="cb12-10">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatAnthropic(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"claude-sonnet-4-5"</span>)</span>
<span id="cb12-11">chat.register_tool(get_upcoming_events)</span>
<span id="cb12-12"></span>
<span id="cb12-13">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"What events do we have about AI?"</span>)</span></code></pre></div></div>
<p>El modelo llama a la función, obtiene los datos, y responde de forma natural — en este caso incluso cambiando al español para la audiencia de PyLadies Monterrey.</p>
<p>Para un ejemplo completo que combina Shiny, chatlas y llamada de herramientas en un chatbot funcional de PyLadies Monterrey, consulta <a href="https://github.com/ivelasq/2026-05-09_connecting-python-with-llms/blob/main/monterrey_app.py"><code>monterrey_app.py</code></a> en el repositorio de la charla.</p>
</section>
<section id="desplegando-chatbots" class="level5">
<h5 class="anchored" data-anchor-id="desplegando-chatbots">Desplegando chatbots</h5>
<p>No lo cubrimos en la charla, pero si quieres desplegar chatbots de Shiny for Python conectados a LLMs con chatlas, <a href="https://connect.posit.cloud/">Posit Connect Cloud</a> es una opción gratuita. Hay documentación disponible sobre cómo <a href="https://docs.posit.co/connect-cloud/how-to/python/llm-shiny-python.html">Deploy a LLM-powered Shiny for Python App with Secrets</a>.</p>
</section>
</section>
<section id="lo-que-sigue" class="level4">
<h4 class="anchored" data-anchor-id="lo-que-sigue">Lo que sigue</h4>
<p>Una vez que te sientas cómoda con lo básico, hay técnicas poderosas para explorar:</p>
<ul>
<li><strong>MCP (Model Context Protocol)</strong> — un protocolo estandarizado para conectar LLMs a fuentes de datos y herramientas</li>
<li><strong>RAG (Retrieval Augmented Generation)</strong> — fundamenta las respuestas en tus propios documentos y bases de conocimiento</li>
<li><strong>Evals</strong> — prueba y mide sistemáticamente la calidad y confiabilidad de tu aplicación LLM</li>
</ul>
</section>
<section id="resumen" class="level4">
<h4 class="anchored" data-anchor-id="resumen">Resumen</h4>
<p>chatlas hace que conectar Python con LLMs sea sencillo:</p>
<ul>
<li><strong>Multi-proveedor</strong> — alterna entre OpenAI, Anthropic, Google, Ollama y más cambiando solo una línea</li>
<li><strong>Llamada de herramientas</strong> — registra cualquier función de Python para que el modelo pueda llamar APIs reales y acceder a datos en vivo</li>
<li><strong>Multimodal</strong> — pasa imágenes y PDFs junto con prompts de texto</li>
<li><strong>Streaming</strong> — devuelve respuestas fragmento a fragmento para una experiencia de usuario fluida</li>
<li><strong>Con estado</strong> — el historial de conversación se rastrea automáticamente</li>
<li><strong>Integración con Shiny</strong> — construye interfaces de chat interactivas en unas pocas líneas de código</li>
</ul>
</section>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p><em>This summary was generated by Claude Sonnet 4.6 and reviewed by me.</em></p>
<section id="what-are-large-language-models" class="level4">
<h4 class="anchored" data-anchor-id="what-are-large-language-models">What are Large Language Models?</h4>
<p>LLMs are AI models trained on massive amounts of text — books, websites, code — that can understand and generate human-like text. They power tools most of us already use: ChatGPT, Claude, Gemini. But using them through a browser is just the beginning.</p>
<blockquote class="blockquote">
<p><em>“Today we’ll go beyond the web interface and learn how to integrate these models directly into your Python code. This opens up possibilities for automation, custom workflows, and building your own AI-powered tools.”</em></p>
</blockquote>
</section>
<section id="interacting-with-llms-using-chatlas" class="level4">
<h4 class="anchored" data-anchor-id="interacting-with-llms-using-chatlas">Interacting with LLMs using chatlas</h4>
<p>There are several ways to work with LLMs in Python programmatically: provider SDKs (OpenAI, Anthropic, Google), or frameworks like LangChain, LlamaIndex, and Haystack. <a href="https://posit-dev.github.io/chatlas/">chatlas</a> aims for a middle ground: simple enough to get started quickly, but flexible enough for real applications.</p>
<blockquote class="blockquote">
<p><em>“chatlas was designed to make LLM integration straightforward. You don’t need to learn complex abstractions or wade through configuration files. It handles common tasks like conversation history automatically, while still giving you access to advanced features when you need them.”</em></p>
</blockquote>
<p>Getting started takes three lines:<sup>3</sup></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb13-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> chatlas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ChatOllama</span>
<span id="cb13-2"></span>
<span id="cb13-3">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3"</span>)</span>
<span id="cb13-4"></span>
<span id="cb13-5">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Tell me something about Monterrey, Mexico."</span>)</span></code></pre></div></div>
<p>You can also add a system prompt to control the model’s behavior — for example, restricting it to Spanish responses no longer than three sentences:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb14-1">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3"</span>,</span>
<span id="cb14-2">                  system_prompt<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Reply in Spanish using at most three sentences."</span>)</span>
<span id="cb14-3"></span>
<span id="cb14-4">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Tell me something about Monterrey, Mexico."</span>)</span></code></pre></div></div>
<p>chatlas works in the Python console for quick experimentation, in scripts for automation, and in Jupyter notebooks for exploratory work.</p>
</section>
<section id="providers-and-models" class="level4">
<h4 class="anchored" data-anchor-id="providers-and-models">Providers and models</h4>
<p>A <strong>provider</strong> is a company that hosts and serves models (OpenAI, Anthropic, Google). A <strong>model</strong> is the specific LLM you’re using (GPT-4, Claude, Gemini). Models differ along several dimensions:</p>
<ol type="1">
<li><strong>Context</strong> — how many tokens can you give the model?</li>
<li><strong>Speed</strong> — how many tokens per second?</li>
<li><strong>Cost</strong> — how much per million tokens?</li>
<li><strong>Intelligence</strong> — reasoning ability and accuracy</li>
<li><strong>Capabilities</strong> — vision, tool calling, structured output, etc.</li>
</ol>
<p>chatlas supports commercial APIs, local models via Ollama, and enterprise services like Bedrock. Crucially, switching providers requires only changing the import (<code>ChatOllama</code> vs <code>ChatAnthropic</code>) and the model (<code>gemma3</code> vs <code>claude-sonnet-4-6</code>) — the rest of your code stays mostly the same:<sup>4</sup></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb15-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> chatlas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ChatOllama</span>
<span id="cb15-2">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3"</span>)</span>
<span id="cb15-3"></span>
<span id="cb15-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># or</span></span>
<span id="cb15-5"></span>
<span id="cb15-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> chatlas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ChatAnthropic</span>
<span id="cb15-7">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatAnthropic(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"claude-sonnet-4-6"</span>,</span>
<span id="cb15-8">                     api_key<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>os.getenv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ANTHROPIC_API_KEY"</span>))</span></code></pre></div></div>
<blockquote class="blockquote">
<p><em>“This flexibility means you can start with one provider and switch to another without rewriting your code.”</em></p>
</blockquote>
</section>
<section id="tool-calling" class="level4">
<h4 class="anchored" data-anchor-id="tool-calling">Tool calling</h4>
<p>Out of the box, LLMs don’t have access to real-time data. Ask about the weather and you’ll get general climate information — not today’s forecast. Tool calling fixes this by letting the model call your Python functions.</p>
<p>The key is the docstring: it tells the model what the function does and what parameters it needs. chatlas converts this automatically into a format the model understands.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb16-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> requests</span>
<span id="cb16-2"></span>
<span id="cb16-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> get_current_weather(lat: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, lng: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>):</span>
<span id="cb16-4">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb16-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    Get the current weather given a latitude and longitude.</span></span>
<span id="cb16-6"></span>
<span id="cb16-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    Parameters</span></span>
<span id="cb16-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    ----------</span></span>
<span id="cb16-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    lat: The latitude of the location.</span></span>
<span id="cb16-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    lng: The longitude of the location.</span></span>
<span id="cb16-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    """</span></span>
<span id="cb16-12">    lat_lng <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"latitude=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>lat<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">&amp;longitude=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>lng<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb16-13">    url <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"https://api.open-meteo.com/v1/forecast?</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>lat_lng<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">&amp;current=temperature_2m,wind_speed_10m"</span></span>
<span id="cb16-14">    response <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> requests.get(url)</span>
<span id="cb16-15">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> response.json()[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"current"</span>]</span>
<span id="cb16-16"></span>
<span id="cb16-17">chat.register_tool(get_current_weather)</span>
<span id="cb16-18">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"How's the weather in Monterrey, Mexico?"</span>)</span></code></pre></div></div>
<p>Once registered, the model recognizes when it needs weather data, calls the function with the right coordinates, and weaves the result into a natural response:</p>
<pre><code># 🔧 tool request
 get_current_weather(lat=25.6866, lng=-100.3161)

# ✅ tool result
 {'temperature_2m': 23.1, 'wind_speed_10m': 4.5}

The current weather in Monterrey is 23.1°C with light winds of 4.5 km/h.</code></pre>
<blockquote class="blockquote">
<p><em>“This is the power of tool calling — your LLM can now interact with any API or data source you provide.”</em></p>
</blockquote>
</section>
<section id="multi-modal-input" class="level4">
<h4 class="anchored" data-anchor-id="multi-modal-input">Multi-modal input</h4>
<p>chatlas can handle more than text. Pass an image file and ask questions about it:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb18" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb18-1">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3"</span>)</span>
<span id="cb18-2"></span>
<span id="cb18-3">chat.chat(</span>
<span id="cb18-4">    chatlas.content_image_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"./images/View_of_Monterrey.jpg"</span>),</span>
<span id="cb18-5">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Can you explain this image? Be concise."</span></span>
<span id="cb18-6">)</span></code></pre></div></div>
<p>PDFs work the same way — useful for processing research papers, reports, or invoices:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb19" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb19-1">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatAnthropic(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"claude-sonnet-4-6"</span>,</span>
<span id="cb19-2">                     api_key<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>os.getenv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ANTHROPIC_API_KEY"</span>))</span>
<span id="cb19-3"></span>
<span id="cb19-4">chat.chat(</span>
<span id="cb19-5">    chatlas.content_pdf_file(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"./images/data-projects-in-monterrey-mexico.pdf"</span>),</span>
<span id="cb19-6">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"What are the main findings? Be concise."</span></span>
<span id="cb19-7">)</span></code></pre></div></div>
<p>Not all models support every input type, so it’s worth checking provider documentation — but vision-capable and document-capable models are increasingly common.</p>
</section>
<section id="streaming-and-chat-history" class="level4">
<h4 class="anchored" data-anchor-id="streaming-and-chat-history">Streaming and chat history</h4>
<p>Streaming returns responses chunk by chunk as they’re generated, which creates a more responsive experience:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb20" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb20-1">stream <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chat.stream(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"My name is Isabella."</span>)</span>
<span id="cb20-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> chunk <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> stream:</span>
<span id="cb20-3">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(chunk)</span></code></pre></div></div>
<p>Chat history is maintained automatically. Later in the same session:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb21" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb21-1">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"What's my name?"</span>)</span>
<span id="cb21-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># → Your name is Isabella!</span></span></code></pre></div></div>
<blockquote class="blockquote">
<p><em>“You don’t need to manually manage context — it just works. This makes building conversational applications much simpler.”</em></p>
</blockquote>
<p>Together, streaming and persistent chat history are the foundation of any chatbot.</p>
</section>
<section id="practical-examples" class="level4">
<h4 class="anchored" data-anchor-id="practical-examples">Practical examples</h4>
<section id="batch-document-summarization" class="level5">
<h5 class="anchored" data-anchor-id="batch-document-summarization">Batch document summarization</h5>
<p>Define the fields you want with a Pydantic model, loop through a folder of PDFs, and save the results as a CSV:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb22" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb22-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> pathlib <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Path</span>
<span id="cb22-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> pydantic <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> BaseModel</span>
<span id="cb22-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb22-4"></span>
<span id="cb22-5">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatGoogle(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemini-1.5-flash"</span>)</span>
<span id="cb22-6"></span>
<span id="cb22-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">class</span> Paper(BaseModel):</span>
<span id="cb22-8">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Extract key information from this research paper."""</span></span>
<span id="cb22-9">    title: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span></span>
<span id="cb22-10">    authors: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>[<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>]</span>
<span id="cb22-11">    year: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span></span>
<span id="cb22-12">    key_findings: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1-2 sentences</span></span>
<span id="cb22-13"></span>
<span id="cb22-14">papers <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb22-15"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> pdf_path <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> Path(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"research_papers/"</span>).glob(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"*.pdf"</span>):</span>
<span id="cb22-16">    result <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chat.chat_structured(</span>
<span id="cb22-17">        chatlas.content_pdf_file(pdf_path), data_model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>Paper</span>
<span id="cb22-18">    )</span>
<span id="cb22-19">    papers.append(result.model_dump())</span>
<span id="cb22-20"></span>
<span id="cb22-21">pd.DataFrame(papers).to_csv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"paper_summaries.csv"</span>, index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span></code></pre></div></div>
<blockquote class="blockquote">
<p><em>“Something that would take hours of manual work becomes a short script that runs in minutes.”</em></p>
</blockquote>
</section>
<section id="building-a-chatbot-with-shiny" class="level5">
<h5 class="anchored" data-anchor-id="building-a-chatbot-with-shiny">Building a chatbot with Shiny</h5>
<p>chatlas integrates directly with <a href="https://shiny.posit.co/py/">Shiny for Python</a>. Shiny provides the chat UI; chatlas handles the LLM:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb23" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb23-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> chatlas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ChatOllama</span>
<span id="cb23-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> shiny.express <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ui</span>
<span id="cb23-3"></span>
<span id="cb23-4">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ui.Chat(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">id</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ui_chat"</span>)</span>
<span id="cb23-5">chat.ui()</span>
<span id="cb23-6"></span>
<span id="cb23-7">chat_model <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatOllama(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gemma3:1b"</span>)</span>
<span id="cb23-8"></span>
<span id="cb23-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@chat.on_user_submit</span></span>
<span id="cb23-10"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">async</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> handle_user_input():</span>
<span id="cb23-11">    response <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chat_model.stream(chat.user_input())</span>
<span id="cb23-12">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">await</span> chat.append_message_stream(response)</span></code></pre></div></div>
</section>
<section id="connecting-a-chatbot-to-your-own-data" class="level5">
<h5 class="anchored" data-anchor-id="connecting-a-chatbot-to-your-own-data">Connecting a chatbot to your own data</h5>
<p>Generic chatbots (ChatGPT, Claude) can’t answer questions about your organization’s data. With chatlas you can register tools that query your local databases, event records, or internal APIs:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb24" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb24-1">EVENTS <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb24-2">    {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"name"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Python &amp; LLMs Workshop"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2026-05-09"</span>,</span>
<span id="cb24-3">     <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"location"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TEC de Monterrey"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"attendees"</span>: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">45</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"topic"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"chatlas and AI"</span>},</span>
<span id="cb24-4">]</span>
<span id="cb24-5"></span>
<span id="cb24-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> get_upcoming_events(topic: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>):</span>
<span id="cb24-7">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Get upcoming PyLadies Monterrey events, optionally filtered by topic."""</span></span>
<span id="cb24-8">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [e <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> e <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> EVENTS <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> topic.lower() <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> e[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"topic"</span>].lower()]</span>
<span id="cb24-9"></span>
<span id="cb24-10">chat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ChatAnthropic(model<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"claude-sonnet-4-5"</span>)</span>
<span id="cb24-11">chat.register_tool(get_upcoming_events)</span>
<span id="cb24-12"></span>
<span id="cb24-13">chat.chat(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"What events do we have about AI?"</span>)</span></code></pre></div></div>
<p>The model calls the function, gets the data, and responds naturally — in this case even switching to Spanish for the PyLadies Monterrey audience.</p>
<p>For a full example that combines Shiny, chatlas, and tool calling into a working PyLadies Monterrey chatbot, see <a href="https://github.com/ivelasq/2026-05-09_connecting-python-with-llms/blob/main/monterrey_app.py"><code>monterrey_app.py</code></a> in the talk repo.</p>
</section>
<section id="deploying-chatbots" class="level5">
<h5 class="anchored" data-anchor-id="deploying-chatbots">Deploying chatbots</h5>
<p>We didn’t cover this in the talk, but if you want to deploy Shiny for Python chatbots connected to LLMs with chatlas, <a href="https://connect.posit.cloud/">Posit Connect Cloud</a> is a free option. Documentation is available on how to <a href="https://docs.posit.co/connect-cloud/how-to/python/llm-shiny-python.html">Deploy a LLM-powered Shiny for Python App with Secrets</a>.</p>
</section>
</section>
<section id="whats-next" class="level4">
<h4 class="anchored" data-anchor-id="whats-next">What’s next</h4>
<p>Once you’re comfortable with the basics, there are powerful techniques to explore:</p>
<ul>
<li><strong>MCP (Model Context Protocol)</strong> — a standardized protocol for connecting LLMs to data sources and tools</li>
<li><strong>RAG (Retrieval Augmented Generation)</strong> — ground responses in your own documents and knowledge bases</li>
<li><strong>Evals</strong> — systematically test and measure your LLM application’s quality and reliability</li>
</ul>
</section>
<section id="summary-1" class="level4">
<h4 class="anchored" data-anchor-id="summary-1">Summary</h4>
<p>chatlas makes it straightforward to connect Python to LLMs:</p>
<ul>
<li><strong>Multi-provider</strong> — swap between OpenAI, Anthropic, Google, Ollama, and more by changing one line</li>
<li><strong>Tool calling</strong> — register any Python function so the model can call real APIs and access live data</li>
<li><strong>Multi-modal</strong> — pass images and PDFs alongside text prompts</li>
<li><strong>Streaming</strong> — return responses chunk by chunk for a responsive user experience</li>
<li><strong>Stateful</strong> — conversation history is tracked automatically</li>
<li><strong>Shiny integration</strong> — build interactive chat UIs in a few lines of code</li>
</ul>
</section>
</div>
</div>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>Esto requiere que Ollama esté instalado y el modelo <code>gemma3</code> descargado localmente. Consulta el artículo <a href="https://posit.co/blog/setting-up-local-llms-for-r-and-python">Setting up local LLMs for R and Python</a> para instrucciones de configuración.↩︎</p></li>
<li id="fn2"><p>A diferencia de <code>ChatOllama</code>, <code>ChatAnthropic</code> requiere una clave de API porque los modelos de Anthropic son un servicio de pago. Para saber cómo almacenar y acceder a las claves de API de forma segura, consulta <a href="https://ivelasq.rbind.io/til-python/python-env/">How to set and access environment variables in Python</a>.↩︎</p></li>
<li id="fn3"><p>This requires Ollama to be installed and the <code>gemma3</code> model downloaded locally. See the <a href="https://posit.co/blog/setting-up-local-llms-for-r-and-python">Setting up local LLMs for R and Python</a> blog post for setup instructions.↩︎</p></li>
<li id="fn4"><p>Unlike <code>ChatOllama</code>, <code>ChatAnthropic</code> requires an API key because Anthropic’s models are a paid service. For how to store and access API keys securely, see <a href="https://ivelasq.rbind.io/til-python/python-env/">How to set and access environment variables in Python</a>.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <guid>https://ivelasq.rbind.io/talk/connecting-python-with-llms/</guid>
  <pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/connecting-python-with-llms/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Getting Started with Quarto: A Hands-On Workshop</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/intro-to-quarto-rnvsu/</link>
  <description><![CDATA[ 




<a href="https://www.meetup.com/r-nvsu/events/313601010/?eventOrigin=group_upcoming_events" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://bit.ly/rnvsu-quarto" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-link-45deg"></i>&nbsp;&nbsp;Website
</a>

<a href="https://github.com/ivelasq/rnvsu-quarto-exercises" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-card-checklist"></i>&nbsp;&nbsp;Exercises
</a>

<a href="https://github.com/ivelasq/2026-04-30_intro-to-quarto" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.meetup.com/r-nvsu/events/313601010/?eventOrigin=group_upcoming_events">R User Group RNVSU</a>
</li>
<li>
📆 30 April 2026 // 09:30 AM PHT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Join us for a virtual, hands-on workshop on Quarto, a tool for creating reproducible documents, reports, and dashboards with R, Python, and more. The next-generation of R Markdown, Quarto makes it easy to combine code, narrative, and results into polished, shareable outputs. In this session, you’ll learn the basics of getting started, explore common workflows, and see how Quarto can help you create clear, reproducible work for the web, presentations, and more.</p>
<h2 class="anchored">
<a href="https://bit.ly/rnvsu-quarto" target="_blank" rel="noopener noreferrer"> Website ↗ </a>
</h2>
<p>Find the materials, exercises, and slides on the website.</p>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/intro-to-quarto-rnvsu/</guid>
  <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/intro-to-quarto-rnvsu/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>The Invisible Work of Data Science Projects</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/invisible-work/</link>
  <description><![CDATA[ 




<a href="https://www.cob.niu.edu/academics/omis/index.shtml" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://ivelasq-the-invisible-work-of-data-science-projects.share.connect.posit.cloud/#/section" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/niu-invisible-work" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://niuits-my.sharepoint.com/:v:/g/personal/a1885832_mail_niu_edu/IQDYfQld0aorSJpGl6UL0IbuAWdyYo9oqzIQnJy2NMuaEhU?nav=eyJyZWZlcnJhbEluZm8iOnsicmVmZXJyYWxBcHAiOiJTdHJlYW1XZWJBcHAiLCJyZWZlcnJhbFZpZXciOiJTaGFyZURpYWxvZy1MaW5rIiwicmVmZXJyYWxBcHBQbGF0Zm9ybSI6IldlYiIsInJlZmVycmFsTW9kZSI6InZpZXcifX0%3D&amp;e=quNOdL" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
🐺 <a href="https://www.meetup.com/rladies-rome/events/302078218/">Northern Illinois University College of Business</a>
</li>
<li>
📆 16 April 2026 // 3:00 PM CT
</li>
<li>
📍️ DeKalb, IL
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>What does it mean to inherit systems you didn’t build? This session examines the procedural habits required to manage data and systems that aren’t our own. We will break down strategies for maintaining high performance when working with everything from unfamiliar tabular data to the black-box nature of large language models.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://ivelasq-the-invisible-work-of-data-science-projects.share.connect.posit.cloud/#/section" height="415" width="800">
</iframe>
<div id="listing-listing-gallery" class="quarto-listing quarto-listing-container-custom">
<style type="text/css">
.grid-gallery {
  columns: 5 200px;
  column-gap: 0.5rem;
  width: 90%;
  margin: 0 auto;
}
.grid-item {
  width: 150px;
  margin: 0 0.5rem 0.5rem 0;
  display: inline-block;
  width: 100%;
  border-radius: 5px;
}
img.grid-item {
  width: 100%;
  transition: all .25s ease-in-out;
}
img.grid-item:hover {
  transform: scale(1.025);
}
</style>
<div class="grid-gallery">
<div>
<p><a href="../../talk/invisible-work/gallery/1.jpg" class="lightbox" data-gallery="quarto-grid-gallery"><img src="https://ivelasq.rbind.io/talk/invisible-work/gallery/1.jpg" class="grid-item img-fluid" loading="lazy"></a></p>
</div>
<div>
<p><a href="../../talk/invisible-work/gallery/2.jpg" class="lightbox" data-gallery="quarto-grid-gallery"><img src="https://ivelasq.rbind.io/talk/invisible-work/gallery/2.jpg" class="grid-item img-fluid" loading="lazy"></a></p>
</div>
<div>
<p><a href="../../talk/invisible-work/gallery/3.jpg" class="lightbox" data-gallery="quarto-grid-gallery"><img src="https://ivelasq.rbind.io/talk/invisible-work/gallery/3.jpg" class="grid-item img-fluid" loading="lazy"></a></p>
</div>
<div>
<p><a href="../../talk/invisible-work/gallery/4.jpg" class="lightbox" data-gallery="quarto-grid-gallery"><img src="https://ivelasq.rbind.io/talk/invisible-work/gallery/4.jpg" class="grid-item img-fluid" loading="lazy"></a></p>
</div>
<div>
<p><a href="../../talk/invisible-work/gallery/5.jpg" class="lightbox" data-gallery="quarto-grid-gallery"><img src="https://ivelasq.rbind.io/talk/invisible-work/gallery/5.jpg" class="grid-item img-fluid" loading="lazy"></a></p>
</div>
<div>
<p><a href="../../talk/invisible-work/gallery/6.jpg" class="lightbox" data-gallery="quarto-grid-gallery"><img src="https://ivelasq.rbind.io/talk/invisible-work/gallery/6.jpg" class="grid-item img-fluid" loading="lazy"></a></p>
</div>
<div>
<p><a href="../../talk/invisible-work/gallery/7.jpg" class="lightbox" data-gallery="quarto-grid-gallery"><img src="https://ivelasq.rbind.io/talk/invisible-work/gallery/7.jpg" class="grid-item img-fluid" loading="lazy"></a></p>
</div>
<div>
<p><a href="../../talk/invisible-work/gallery/8.jpg" class="lightbox" data-gallery="quarto-grid-gallery"><img src="https://ivelasq.rbind.io/talk/invisible-work/gallery/8.jpg" class="grid-item img-fluid" loading="lazy"></a></p>
</div>
</div>
<div class="listing-no-matching d-none">No matching items</div>
</div>
<p>Photo gallery EJS created by <a href="https://github.com/orgs/quarto-dev/discussions/5972">Mickaël Canouil</a>.</p>



</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/invisible-work/</guid>
  <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/invisible-work/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Working smarter with {dplyr} 1.2.0</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/dplyr-1-2-0/</link>
  <description><![CDATA[ 




<a href="https://www.meetup.com/rladies-rome/events/313630747/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://ivelasq-dplyr-1-2-0.share.connect.posit.cloud" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/2026-03-18_dplyr-1-2-0" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://www.youtube.com/watch?v=xCbFl_Ez6VM" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>  
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.meetup.com/rladies-rome/events/313630747/?eventOrigin=group_events_list">R-Ladies Rome</a>
</li>
<li>
📆 18 March 2026 // 01:00 PM ET
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>The tidyverse keeps evolving, and {dplyr} 1.2.0 brings a set of new tools that make data manipulation even more expressive and flexible. Whether you regularly work with R and the tidyverse, or you’re looking to sharpen your data wrangling skills, this session will help you better understand the design philosophy behind the latest {dplyr} release and how to apply it effectively.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://ivelasq-dplyr-1-2-0.share.connect.posit.cloud" height="415" width="800">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<iframe width="800" height="415" src="https://www.youtube.com/embed/xCbFl_Ez6VM?si=Yq178oYeqDzi4fI0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>
</section>
<section id="summary" class="level2">
<h2 class="anchored" data-anchor-id="summary">Summary</h2>
<p><em>This summary was generated by Claude Sonnet 4.6 and reviewed by me.</em></p>
<section id="todays-data" class="level3">
<h3 class="anchored" data-anchor-id="todays-data">Today’s data</h3>
<p>We’ll use salmonid mortality data from <a href="https://github.com/rfordatascience/tidytuesday/blob/main/data/2026/2026-03-17/readme.md">TidyTuesday</a>, published by the Norwegian Veterinary Institute. The dataset covers monthly mortality data from 2020.</p>
<blockquote class="blockquote">
<p><em>“The data is going to be shared saved in an object called <code>monthly_losses_data</code>. And if we read in that CSV and take a look at the first few rows, you’ll notice that there are nine columns that cover things like species, date, geo group, region, losses, and a variety of variables that describe how those losses happened. And so just a really nice data set to practice some of the functions that we’re going to be taking a look at.”</em></p>
</blockquote>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1">monthly_losses_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span></span>
<span id="cb1-2">  readr<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">read_csv</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2026/2026-03-17/monthly_losses_data.csv'</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Rows: 2808 Columns: 9
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (3): species, geo_group, region
dbl  (5): losses, dead, discarded, escaped, other
date (1): date

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(monthly_losses_data)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 6 × 9
  species date       geo_group region losses   dead discarded escaped other
  &lt;chr&gt;   &lt;date&gt;     &lt;chr&gt;     &lt;chr&gt;   &lt;dbl&gt;  &lt;dbl&gt;     &lt;dbl&gt;   &lt;dbl&gt; &lt;dbl&gt;
1 salmon  2020-01-01 area      1       31425  28126      3299       0     0
2 salmon  2020-01-01 area      2      324116 277888     46113       0   115
3 salmon  2020-01-01 area      3      844829 776983     63770       0  4076
4 salmon  2020-01-01 area      4      676852 623159     51823       0  1870
5 salmon  2020-01-01 area      5      109269  97627     11424       0   218
6 salmon  2020-01-01 area      6      548921 531193     15710       0  2018</code></pre>
</div>
</div>
</section>
<section id="a-quick-dplyr-refresher" class="level3">
<h3 class="anchored" data-anchor-id="a-quick-dplyr-refresher">A quick dplyr refresher</h3>
<p>dplyr is a grammar of data manipulation, providing a consistent set of verbs that help you solve the most common data manipulation challenges.</p>
<blockquote class="blockquote">
<p><em>“dplyr is a core member of the tidyverse which is a curated collection of R packages specifically for data science. All the tidyverse packages share this opinionated philosophy that data should be in what’s called a tidy format — each variable is a column, each observation is a row, each value is a cell.”</em></p>
</blockquote>
<p>Here are the core functions we’ll use as a foundation:</p>
<p><strong><code>arrange()</code></strong> — changes the ordering of rows:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb5-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">arrange</span>(date)</span></code></pre></div></div>
<p><strong><code>select()</code></strong> — picks variables based on their names:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb6-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb6-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(species, dead, discarded, escaped, other)</span></code></pre></div></div>
</div>
<p><strong><code>summarise()</code></strong> — reduces multiple values down to a single summary:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb7-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb7-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summarize</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">mean_losses =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mean</span>(losses))</span></code></pre></div></div>
<p><strong><code>group_by()</code></strong> — performs any operation “by group”:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb8-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb8-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">group_by</span>(region) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb8-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summarize</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">mean =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mean</span>(losses))</span></code></pre></div></div>
<p><strong><code>mutate()</code></strong> — adds new variables that are functions of existing variables:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb9-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb9-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">total =</span> dead <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> discarded <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> escaped <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> other)</span></code></pre></div></div>
<p><strong><code>case_when()</code></strong> — checks each condition in order and assigns a value based on the first match:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb10-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb10-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">loss_rating =</span></span>
<span id="cb10-3">           <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">case_when</span>(losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100000</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"High"</span>,</span>
<span id="cb10-4">                     losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100000</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Low"</span>))</span></code></pre></div></div>
<p><strong><code>filter()</code></strong> — picks cases based on their values:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb11-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1"</span>)</span></code></pre></div></div>
<blockquote class="blockquote">
<p><em>“dplyr is a grammar. This kind of syntax — taking your data frame, using a pipe, using a verb, and then specifying the columns — that’s the general syntax that we’ll see throughout this presentation.”</em></p>
</blockquote>
</section>
<section id="dplyr-1.2.0" class="level3">
<h3 class="anchored" data-anchor-id="dplyr-1.2.0">dplyr 1.2.0</h3>
<p>Everything covered below is explored in great detail in the <a href="https://tidyverse.org/blog/2026/02/dplyr-1-2-0/">dplyr 1.2.0 blog post by Davis Vaughan</a>.</p>
<section id="filter_out" class="level4">
<h4 class="anchored" data-anchor-id="filter_out"><code>filter_out()</code></h4>
<section id="the-problem" class="level5">
<h5 class="anchored" data-anchor-id="the-problem">The problem</h5>
<p>Have you ever stared at <code>filter(region == "1")</code> and wondered: am I <em>keeping</em> Region 1 or <em>dropping</em> it?</p>
<blockquote class="blockquote">
<p><em>“The original filter function was optimized for keeping rows. And often, because it was the quickest tool at our disposal or the only tool that we had, we may have forced it to drop rows using negative logic.”</em></p>
</blockquote>
<p>Here’s what that looks like in practice. Say we have a small dataset with an <code>NA</code> in the losses column:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb12-1">monthly_losses_NA</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 5 × 3
  species region losses
  &lt;chr&gt;   &lt;chr&gt;   &lt;dbl&gt;
1 salmon  1       31425
2 salmon  2      324116
3 salmon  3      844829
4 salmon  3      676852
5 salmon  3          NA</code></pre>
</div>
</div>
<p>We want to drop rows where <code>region == 3</code> and <code>losses &gt; 700000</code>. Using the traditional approach:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb14-1">monthly_losses_NA <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb14-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span>(region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">700000</span>))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 3 × 3
  species region losses
  &lt;chr&gt;   &lt;chr&gt;   &lt;dbl&gt;
1 salmon  1       31425
2 salmon  2      324116
3 salmon  3      676852</code></pre>
</div>
</div>
<p>The row with <code>NA</code> losses was silently dropped too — not what we wanted. To handle NAs correctly with <code>filter()</code>, we’d need:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb16-1">monthly_losses_NA <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb16-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(</span>
<span id="cb16-3">    <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span>((region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(region)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span></span>
<span id="cb16-4">             (losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">700000</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(losses)))</span>
<span id="cb16-5">    )</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 4 × 3
  species region losses
  &lt;chr&gt;   &lt;chr&gt;   &lt;dbl&gt;
1 salmon  1       31425
2 salmon  2      324116
3 salmon  3      676852
4 salmon  3          NA</code></pre>
</div>
</div>
</section>
<section id="the-solution-filter_out" class="level5">
<h5 class="anchored" data-anchor-id="the-solution-filter_out">The solution: <code>filter_out()</code></h5>
<blockquote class="blockquote">
<p><em>“Rather than trying to think through negations and logic and things like that, just remember: use <code>filter()</code> to keep rows, use <code>filter_out()</code> to drop rows.”</em></p>
</blockquote>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb18" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb18-1">monthly_losses_NA <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb18-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter_out</span>(region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">700000</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 4 × 3
  species region losses
  &lt;chr&gt;   &lt;chr&gt;   &lt;dbl&gt;
1 salmon  1       31425
2 salmon  2      324116
3 salmon  3      676852
4 salmon  3          NA</code></pre>
</div>
</div>
<p>dplyr with <code>filter_out()</code> assumes that if a row is <code>NA</code> or unknown, you probably don’t want to drop it — so it only drops rows that definitively meet your criteria.</p>
</section>
</section>
<section id="when_any-and-when_all" class="level4">
<h4 class="anchored" data-anchor-id="when_any-and-when_all"><code>when_any()</code> and <code>when_all()</code></h4>
<section id="the-problem-1" class="level5">
<h5 class="anchored" data-anchor-id="the-problem-1">The problem</h5>
<p>Combining multiple OR conditions with <code>filter()</code> leads to deeply nested, error-prone code:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb20" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb20-1">monthly_losses_filters <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb20-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(</span>
<span id="cb20-3">    (region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%in%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"7"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"8"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400000</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|</span></span>
<span id="cb20-4">           (region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%in%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"9"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300000</span>)</span>
<span id="cb20-5">    )</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 4 × 3
# Groups:   region [4]
  species region losses
  &lt;chr&gt;   &lt;chr&gt;   &lt;dbl&gt;
1 salmon  2      324116
2 salmon  7      475115
3 salmon  8      442659
4 salmon  9      311127</code></pre>
</div>
</div>
<blockquote class="blockquote">
<p><em>“It starts to indent. You have to remember where you put your parentheses because there are a lot of them. As you can imagine, it can just get very unwieldy to write something like this, especially if you have many OR statements.”</em></p>
</blockquote>
</section>
<section id="the-solution-when_any-and-when_all" class="level5">
<h5 class="anchored" data-anchor-id="the-solution-when_any-and-when_all">The solution: <code>when_any()</code> and <code>when_all()</code></h5>
<p>Use <code>when_any()</code> for OR conditions and <code>when_all()</code> for AND conditions:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb22" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb22-1">monthly_losses_filters <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb22-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(</span>
<span id="cb22-3">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">when_any</span>(</span>
<span id="cb22-4">      (region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%in%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"7"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"8"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400000</span>),</span>
<span id="cb22-5">      (region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%in%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"9"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300000</span>)</span>
<span id="cb22-6">    )</span>
<span id="cb22-7">  )</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 4 × 3
# Groups:   region [4]
  species region losses
  &lt;chr&gt;   &lt;chr&gt;   &lt;dbl&gt;
1 salmon  2      324116
2 salmon  7      475115
3 salmon  8      442659
4 salmon  9      311127</code></pre>
</div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb24" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb24-1">monthly_losses_filters <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb24-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(</span>
<span id="cb24-3">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">when_all</span>(</span>
<span id="cb24-4">      region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%in%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"7"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"8"</span>),</span>
<span id="cb24-5">      losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400000</span></span>
<span id="cb24-6">    )</span>
<span id="cb24-7">  )</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 2 × 3
# Groups:   region [2]
  species region losses
  &lt;chr&gt;   &lt;chr&gt;   &lt;dbl&gt;
1 salmon  7      475115
2 salmon  8      442659</code></pre>
</div>
</div>
<blockquote class="blockquote">
<p><em>“<code>when_any()</code> and <code>when_all()</code> continue this theme of intent-based coding — you lead with exactly what it is that you want. Your requirements are just separated by a comma, everything is indented at the same level, and hopefully much easier for a colleague to follow your logic.”</em></p>
</blockquote>
<p>Both helpers also work with the new <code>filter_out()</code>.</p>
</section>
</section>
<section id="new-recoding-and-replacing-functions" class="level4">
<h4 class="anchored" data-anchor-id="new-recoding-and-replacing-functions">New recoding and replacing functions</h4>
<section id="some-background" class="level5">
<h5 class="anchored" data-anchor-id="some-background">Some background</h5>
<p>Recoding used to involve choosing between <code>if/else</code>, <code>case_when()</code>, <code>recode()</code>, or <code>recode()</code> + rlang’s <code>!!!</code> splicing operator — each with its own quirky syntax.</p>
<blockquote class="blockquote">
<p><em>“There are so many ways of recoding — if/else, case_when, recode, recode with rlang — and each one is very specific in how it works, each one brings their own set of syntax, and it could get really confusing.”</em></p>
</blockquote>
</section>
<section id="recoding-vs.-replacing" class="level5">
<h5 class="anchored" data-anchor-id="recoding-vs.-replacing">Recoding vs.&nbsp;replacing</h5>
<p>Two important distinctions:</p>
<ul>
<li><strong>Recoding</strong> — creating an entirely new column using values from an existing column</li>
<li><strong>Replacing</strong> — partially updating an existing column with new values</li>
</ul>
</section>
<section id="the-new-family" class="level5">
<h5 class="anchored" data-anchor-id="the-new-family">The new family</h5>
<p>dplyr 1.2.0 introduces three new functions alongside <code>case_when()</code>:</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Task</th>
<th>Match by</th>
<th>Function</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Recode</td>
<td>Conditions</td>
<td><code>case_when()</code></td>
</tr>
<tr class="even">
<td>Recode</td>
<td>Values</td>
<td><code>recode_values()</code></td>
</tr>
<tr class="odd">
<td>Replace</td>
<td>Conditions</td>
<td><code>replace_when()</code></td>
</tr>
<tr class="even">
<td>Replace</td>
<td>Values</td>
<td><code>replace_values()</code></td>
</tr>
</tbody>
</table>
</section>
<section id="recode_values" class="level5">
<h5 class="anchored" data-anchor-id="recode_values"><code>recode_values()</code></h5>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb26" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb26-1">po_mapping <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(</span>
<span id="cb26-2">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Jæren"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Ryfylke"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"3"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Sotra"</span>,</span>
<span id="cb26-3">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"4"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Stadt"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"5"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Hustadvika"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"6"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nordmøre"</span>,</span>
<span id="cb26-4">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"7"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nord-Trøndelag"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"8"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Bodø"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"9"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Vestlfjorden"</span>,</span>
<span id="cb26-5">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"10"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Andfjorden"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"11"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Kvaløya"</span>,</span>
<span id="cb26-6">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"12"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Vest-Finnmark"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"13"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Øst-Finnmark"</span></span>
<span id="cb26-7">)</span></code></pre></div></div>
</div>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb27" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb27-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb27-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(species, geo_group, region, losses) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb27-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(geo_group <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb27-4">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(</span>
<span id="cb27-5">    <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">production_area =</span> region <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb27-6">      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">recode_values</span>(</span>
<span id="cb27-7">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1"</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Jæren"</span>,</span>
<span id="cb27-8">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"2"</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Ryfylke"</span>,</span>
<span id="cb27-9">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ...</span></span>
<span id="cb27-10">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"13"</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Øst-Finnmark"</span>,</span>
<span id="cb27-11">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">unmatched =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"error"</span></span>
<span id="cb27-12">      )</span>
<span id="cb27-13">  )</span></code></pre></div></div>
</div>
<p>The <code>unmatched = "error"</code> argument is particularly useful:</p>
<blockquote class="blockquote">
<p><em>“Say I was unaware that my dataset actually has 14 regions instead of 13 and I didn’t give it something to recode for region 14. I could put <code>unmatched = "error"</code>. And when I run this, it will actually stop the code and let me know immediately — hey, you didn’t match your list to everything. It’s a good way of cleaning up your pipeline and avoiding those kind of silent errors.”</em></p>
</blockquote>
<p>You can also use a lookup table instead of listing values inline:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb28" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb28-1">po_mapping_tibble <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span></span>
<span id="cb28-2">  tibble<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">enframe</span>(po_mapping, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">name =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"from"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">value =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"to"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb28-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">unnest</span>(to)</span>
<span id="cb28-4"></span>
<span id="cb28-5">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb28-6">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(species, geo_group, region, losses) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb28-7">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">filter</span>(geo_group <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"area"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb28-8">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">production_area =</span></span>
<span id="cb28-9">           <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">recode_values</span>(region,</span>
<span id="cb28-10">                         <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">from =</span> po_mapping_tibble<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>from,</span>
<span id="cb28-11">                         <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">to =</span> po_mapping_tibble<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>to)</span>
<span id="cb28-12">         )</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 1,512 × 5
   species geo_group region losses production_area
   &lt;chr&gt;   &lt;chr&gt;     &lt;chr&gt;   &lt;dbl&gt; &lt;chr&gt;          
 1 salmon  area      1       31425 Jæren          
 2 salmon  area      2      324116 Ryfylke        
 3 salmon  area      3      844829 Sotra          
 4 salmon  area      4      676852 Stadt          
 5 salmon  area      5      109269 Hustadvika     
 6 salmon  area      6      548921 Nordmøre       
 7 salmon  area      7      231487 Nord-Trøndelag 
 8 salmon  area      8      442659 Bodø           
 9 salmon  area      9      311127 Vestlfjorden   
10 salmon  area      10     288849 Andfjorden     
# ℹ 1,502 more rows</code></pre>
</div>
</div>
</section>
<section id="replace_values" class="level5">
<h5 class="anchored" data-anchor-id="replace_values"><code>replace_values()</code></h5>
<p>Use <code>replace_values()</code> when you want to update specific values within an <em>existing</em> column — all other values stay the same:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb30" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb30-1">monthly_losses_data_po <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb30-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">production_area =</span> production_area <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb30-3">           <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">replace_values</span>(</span>
<span id="cb30-4">             <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nordmøre"</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nordmøre + Sør-Trøndelag"</span>,</span>
<span id="cb30-5">             <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nord-Trøndelag"</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Nord-Trøndelag + Bindal"</span></span>
<span id="cb30-6">             )</span>
<span id="cb30-7">         )</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 1,512 × 5
   species geo_group region losses production_area         
   &lt;chr&gt;   &lt;chr&gt;     &lt;chr&gt;   &lt;dbl&gt; &lt;chr&gt;                   
 1 salmon  area      1       31425 Jæren                   
 2 salmon  area      2      324116 Ryfylke                 
 3 salmon  area      3      844829 Sotra                   
 4 salmon  area      4      676852 Stadt                   
 5 salmon  area      5      109269 Hustadvika              
 6 salmon  area      6      548921 Nordmøre + Sør-Trøndelag
 7 salmon  area      7      231487 Nord-Trøndelag + Bindal 
 8 salmon  area      8      442659 Bodø                    
 9 salmon  area      9      311127 Vestlfjorden            
10 salmon  area      10     288849 Andfjorden              
# ℹ 1,502 more rows</code></pre>
</div>
</div>
</section>
<section id="replace_when" class="level5">
<h5 class="anchored" data-anchor-id="replace_when"><code>replace_when()</code></h5>
<p><code>case_when()</code> requires a <code>.default</code> argument, otherwise unmatched rows become <code>NA</code>. <code>replace_when()</code> knows you only intend to replace <em>some</em> values — so no <code>.default</code> needed:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb32" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb32-1">monthly_losses_data <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb32-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">slice</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb32-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">select</span>(species, region, losses) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb32-4">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mutate</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">losses =</span></span>
<span id="cb32-5">           <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">replace_when</span>(losses,</span>
<span id="cb32-6">                        losses <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">500000</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">500000</span>)</span>
<span id="cb32-7">         )</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># A tibble: 4 × 3
  species region losses
  &lt;chr&gt;   &lt;chr&gt;   &lt;dbl&gt;
1 salmon  1       31425
2 salmon  2      324116
3 salmon  3      500000
4 salmon  4      500000</code></pre>
</div>
</div>
</section>
</section>
</section>
<section id="additional-notes" class="level3">
<h3 class="anchored" data-anchor-id="additional-notes">Additional notes</h3>
<ul>
<li><strong><code>case_match()</code> has been soft deprecated</strong> — it has been fully replaced by <code>recode_values()</code> and <code>replace_values()</code>.</li>
<li><strong>Speed improvements</strong> — core functions like <code>if_else()</code> and <code>case_when()</code> have been rewritten in C using the vctrs framework, bringing speed gains across the tidyverse. See the <a href="https://tidyverse.org/blog/2026/02/dplyr-performance/">dplyr performance blog post</a>.</li>
<li><strong>Updating your LLM</strong> — because dplyr 1.2.0 is so new, your AI assistant may not know about <code>filter_out()</code>, <code>when_any()</code>, or the new recode functions. Give it context by pasting the release notes or blog post into the conversation, adding a <code>CLAUDE.md</code> file, or using an MCP server.</li>
</ul>
</section>
<section id="community-feedback-matters" class="level3">
<h3 class="anchored" data-anchor-id="community-feedback-matters">Community feedback matters</h3>
<blockquote class="blockquote">
<p><em>“dplyr 1.2.0 is a direct result of community feedback. The authors are incredibly active on platforms like Bluesky and they don’t just post updates — they also ask for your thoughts. And the reason that dplyr is more efficient, faster, and everything is because the people building it are listening to the people using it. So if you ever find yourself at a point where you have a really messy workaround, I highly encourage you to share it — because you might just inspire the next big feature in 1.3.0.”</em></p>
</blockquote>
<p>Discussions happen in the <a href="https://github.com/tidyverse/tidyups">Tidyups repo</a> on GitHub, where the tidyverse team proposes ideas and invites community comment.</p>
</section>
<section id="summary-1" class="level3">
<h3 class="anchored" data-anchor-id="summary-1">Summary</h3>
<p>dplyr 1.2.0 introduces:</p>
<ul>
<li><strong><code>filter_out()</code></strong> — the missing complement to <code>filter()</code>, for dropping rows cleanly and safely</li>
<li><strong><code>when_any()</code> and <code>when_all()</code></strong> — helpers for expressing OR and AND conditions more clearly inside <code>filter()</code> and <code>filter_out()</code></li>
<li><strong><code>recode_values()</code></strong>, <strong><code>replace_values()</code></strong>, and <strong><code>replace_when()</code></strong> — a complete, coherent family for recoding and replacing values</li>
</ul>
<p>To upgrade:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb34" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb34-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pak"</span>)</span>
<span id="cb34-2">pak<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">::</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pak</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dplyr"</span>)</span></code></pre></div></div>
</section>
</section>
<section id="links" class="level2">
<h2 class="anchored" data-anchor-id="links">Links</h2>
<ul>
<li><a href="https://tidyverse.org">tidyverse.org</a></li>
<li><a href="https://dplyr.tidyverse.org">dplyr</a></li>
<li><a href="https://tidyverse.org/blog/2026/02/dplyr-1-2-0/">dplyr 1.2.0 blog post</a></li>
<li><a href="https://tidyverse.org/blog/2026/02/dplyr-performance/">dplyr performance blog post</a></li>
<li><a href="https://www.linkedin.com/posts/libbyheeren_rstats-activity-7343291858275487744-XlPl/?rcm=ACoAAAy7IywB2qfaREGGoCca5XkthJ2hLjru6ts">Libby’s LinkedIn post</a></li>
<li><a href="https://github.com/tidyverse/tidyups">Tidyups repo</a></li>
<li><a href="https://cghlewis.com/blog/dplyr_update/">Crystal Lewis blog post</a></li>
<li><a href="https://www.youtube.com/watch?v=zYCAz88WjHc&amp;list=PL9HYL-VRX0oSeWeMEGQt0id7adYQXebhT">Data Science Lab YouTube playlist</a></li>
<li><a href="https://tidydatatutor.com/vis.html#">Tidy Data Tutor</a></li>
<li><a href="https://github.com/rfordatascience/tidytuesday/blob/main/data/2026/2026-03-17/readme.md">TidyTuesday dataset</a></li>
<li><a href="https://github.com/EmilHvitfeldt/quarto-revealjs-editable">quarto-revealjs-editable extension by Emil Hvitfeldt</a></li>
</ul>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/dplyr-1-2-0/</guid>
  <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/dplyr-1-2-0/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Categorical Survey of Complex Survey Data in R</title>
  <dc:creator>Rebecca Powell</dc:creator>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/categorical-survey-analysis/</link>
  <description><![CDATA[ 




<a href="https://www.mapor.org/2025-annual-conference/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://tidy-survey-r.github.io/mapor-2025-short-course/full-slide-deck.html#/title-slide/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/tidy-survey-r/mapor-2025-short-course" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.mapor.org/2025-annual-conference/">MAPOR 2025</a>
</li>
<li>
📆 21 November 2025 // 08:30 AM CT
</li>
<li>
🌆️ Chicago, IL
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>This interactive short course will introduce how to analyze categorical survey data in R. We will cover the R functions needed to create the survey design object to account for the sampling design, obtain weighted proportions from survey data, and conduct tests and simple linear regression models. Throughout the course, you will get hands-on experience using data from the American National Election Studies. We will be using Posit Cloud, so you do not need to have R or RStudio preinstalled on your computer. For the best learning experience, we recommend you have prior experience with R and the tidyverse, including familiarity with <code>summarize()</code> and <code>group_by()</code>.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://tidy-survey-r.github.io/mapor-2025-short-course/full-slide-deck.html#/title-slide/" height="415" width="800">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/categorical-survey-analysis/</guid>
  <pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/categorical-survey-analysis/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Creating Polished, Branded Documents with Quarto</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/branded-quarto-rpharma/</link>
  <description><![CDATA[ 




<a href="https://rinpharma.com/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://019a4f2d-6b79-72c1-834b-c2a9488f9ec8.share.connect.posit.cloud/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-link-45deg"></i>&nbsp;&nbsp;Website
</a>

<a href="https://github.com/ivelasq/rpharma2025-quarto-exercises" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-card-checklist"></i>&nbsp;&nbsp;Exercises
</a>

<a href="https://github.com/ivelasq/2025-11-04_branded-quarto/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://www.youtube.com/watch?v=sVMgLKXJ4uc" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>   
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://rinpharma.com/">R/Pharma 2025</a>
</li>
<li>
📆 04 November 2025 // 01:00 PM ET
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Join us for a hands-on, one-day workshop at R/Pharma, where we’ll explore the versatility of Quarto output formats. You will learn how to create dynamic websites, professional PDF documents, engaging presentations, and interactive dashboards using Quarto. This workshop highlights Quarto’s powerful theming capabilities, including the new support for brand.yml, which ensures that your work maintains a professional and cohesive style across all formats.</p>
<h2 class="anchored">
<a href="https://019a4f2d-6b79-72c1-834b-c2a9488f9ec8.share.connect.posit.cloud/" target="_blank" rel="noopener noreferrer"> Website ↗ </a>
</h2>
<p>Find the materials, exercises, and slides on the website.</p>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<iframe width="800" height="415" src="https://www.youtube.com/embed/sVMgLKXJ4uc?si=tXux1g2JPpQGwVZu" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/branded-quarto-rpharma/</guid>
  <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/branded-quarto-rpharma/thumbnail.gif" medium="image" type="image/gif"/>
</item>
<item>
  <title>Automating Repetitive Reports with Quarto</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/automated-quarto-reports/</link>
  <description><![CDATA[ 




<a href="https://www.mapor.org/2025-mapor-fall-webinar-series/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://ivelasq-automating-quarto.share.connect.posit.cloud/#/title-slide" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/2025-10-24_automating-quarto" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://github.com/ivelasq/reports-with-quarto-exercises" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-card-checklist"></i>&nbsp;&nbsp;Exercises
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.mapor.org/2025-mapor-fall-webinar-series/">MAPOR Fall Webinar Series 2025</a>
</li>
<li>
📆 24 October 2025 // 12:00 PM CT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Writing reports often means repeating the same tasks: copying results, updating text, and exporting to different formats. Quarto is a technical publishing tool that streamlines this process by combining text, code, and visuals together in one document. Instead of rewriting the same report with minor changes, you can generate multiple versions from a single template. In this webinar, we’ll walk through practical examples, such as client-specific reports and recurring updates, to show how Quarto helps you save time, reduce errors, and deliver consistent, professional reports.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://ivelasq-automating-quarto.share.connect.posit.cloud/#/title-slide" height="415" width="800">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/automated-quarto-reports/</guid>
  <pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/automated-quarto-reports/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Positron for RStudio Users: A Gentle Introduction</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/positron-for-rstudio-users/</link>
  <description><![CDATA[ 




<a href="https://www.meetup.com/rladies-gaborone/events/311167479/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="../positron-for-rstudio-users-presentation/index.html" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>
    
<a href="https://www.youtube.com/watch?v=2fOQzgkxi6g" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>   
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.meetup.com/rladies-gaborone/events/311167479/">R-Ladies Gaborone</a>
</li>
<li>
📆 09 October 2025 // 11:00 AM CT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Curious about Positron, the new open-source data science IDE from Posit? This session will walk RStudio users through the basics of Positron, highlight familiar features, and show what’s new. Whether you’re exploring it for the first time or considering a switch, you’ll leave with a clear sense of how Positron can fit into your workflow.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="../positron-for-rstudio-users-presentation/index.html" height="415" width="800">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<iframe width="800" height="415" src="https://www.youtube.com/embed/2fOQzgkxi6g?si=rvkYtrvAbehQUGCm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/positron-for-rstudio-users/</guid>
  <pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/positron-for-rstudio-users/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Branded Websites, Presentations, Dashboards, and PDFs with Quarto</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <dc:creator>Sara Altman</dc:creator>
  <link>https://ivelasq.rbind.io/talk/branded-quarto/</link>
  <description><![CDATA[ 




<a href="https://posit.co/conference/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://posit-conf-2025.github.io/quarto-brand/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-link-45deg"></i>&nbsp;&nbsp;Website
</a>

<a href="https://github.com/posit-conf-2025/quarto-brand" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://github.com/posit-dev/quarto-brand-exercises/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-card-checklist"></i>&nbsp;&nbsp;Exercises
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://posit.co/conference/">posit::conf(2025)</a>
</li>
<li>
📆 16 September 2025 // 09:00 AM ET
</li>
<li>
🍑️ Atlanta, GA
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Join us for a hands-on, one-day workshop at posit::conf(2025), where we’ll explore the versatility of <a href="https://quarto.org/">Quarto</a> output formats. Designed for data scientists, analysts, and content creators, this immersive session will teach you how to craft cohesive reports and presentations while refining your workflow with Quarto’s latest features.</p>
<p>You will learn how to create dynamic websites, professional PDF documents, engaging presentations, and interactive dashboards using Quarto. This workshop highlights Quarto’s powerful theming capabilities, including the new support for brand.yml, which ensures that your work maintains a professional and cohesive style across all formats.</p>
<p>By the end of the session, you’ll be equipped to:</p>
<ul>
<li>Build and deploy Quarto websites.</li>
<li>Generate professional presentations and PDF reports.</li>
<li>Create interactive dashboards for data visualization and reporting.</li>
<li>Use brand.yml to define and apply consistent theming across all outputs.</li>
</ul>
<p>Whether you’re looking to enhance your personal projects or streamline organizational outputs, this workshop will equip you with the tools to create polished, professional results.</p>
</section>
<section id="website" class="level2">
<h2 class="anchored" data-anchor-id="website"><a href="https://posit-conf-2025.github.io/quarto-brand/" target="_blank">Website</a></h2>
<iframe src="https://posit-conf-2025.github.io/quarto-brand/" width="800" height="1100">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/branded-quarto/</guid>
  <pubDate>Tue, 16 Sep 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/branded-quarto/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Complex Survey Data Analysis: A Tidy Introduction with {srvyr} and {survey}</title>
  <dc:creator>Stephanie Zimmer</dc:creator>
  <dc:creator>Rebecca Powell</dc:creator>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/survey-data-tutorial/</link>
  <description><![CDATA[ 




<a href="https://user2025.r-project.org/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://tidy-survey-r.github.io/user-2025-survey-data-tutorial/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-link-45deg"></i>&nbsp;&nbsp;Website
</a>

<a href="https://github.com/tidy-survey-r/user-2025-survey-data-tutorial/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://user2025.r-project.org/">useR! 2025</a>
</li>
<li>
📆 08 August 2025 // 01:00 PM ET
</li>
<li>
💙️ Duke University
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>This interactive tutorial will introduce how to conduct analysis of survey data in R. We will first introduce a unifying workflow of tidy survey analysis in R for analysis of survey microdata with weights. We will cover topics of descriptive analysis, including functions to obtain weighted proportions, means, quantiles, and correlations from survey data. Then, we will discuss some statistical testing, including t-tests for comparing means and χ-squared tests for comparing proportions. Finally, we will discuss common probability sampling designs and how to create the survey design objects in R to account for the sampling design. The tutorial will include time for exercises using data from the 2020 American National Election Study and the 2020 Residential Energy Consumption Survey, so you can get hands-on experience with the functions. We will be using Posit Cloud, so you do not need to have R or RStudio preinstalled on your computer. For the best learning experience, we recommend you have some prior experience with R and the tidyverse, including familiarity with <code>mutate()</code>, <code>summarize()</code>, <code>count()</code>, and <code>group_by()</code>.</p>
</section>
<section id="website" class="level2">
<h2 class="anchored" data-anchor-id="website"><a href="https://tidy-survey-r.github.io/user-2025-survey-data-tutorial/" target="_blank">Website</a></h2>
<iframe src="https://tidy-survey-r.github.io/user-2025-survey-data-tutorial/" height="1850" width="800">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/survey-data-tutorial/</guid>
  <pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/survey-data-tutorial/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Quarto—To Tell Your Story with Data</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/quarto-tell-your-story/</link>
  <description><![CDATA[ 




<a href="https://community.amstat.org/gasp/home" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://ivelasq-gasp2025-quarto.share.connect.posit.cloud/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-link-45deg"></i>&nbsp;&nbsp;Website
</a>

<a href="https://github.com/ivelasq/gasp2025-quarto-exercises" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-card-checklist"></i>&nbsp;&nbsp;Exercises
</a>

<a href="https://github.com/ivelasq/2025-06-26_intro-to-quarto" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://www.youtube.com/watch?v=P5YfCELjaCM" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://community.amstat.org/gasp/home">Government Advances in Statistical Programming (GASP) 2025</a>
</li>
<li>
📆 26 June 2025 // 10:30 AM ET
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Join us for a 75-minute introduction to Quarto, the next-generation scientific and technical publishing system. In this workshop, you’ll learn the fundamentals of Quarto. We’ll cover document creation, code integration, and output customization, equipping you to build your own Quarto documents.</p>
</section>
<section id="website" class="level2">
<h2 class="anchored" data-anchor-id="website"><a href="https://ivelasq-gasp2025-quarto.share.connect.posit.cloud/" target="_blank">Website</a></h2>
<iframe src="https://ivelasq-gasp2025-quarto.share.connect.posit.cloud/" width="800" height="1250">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<iframe width="800" height="415" src="https://www.youtube.com/embed/P5YfCELjaCM?si=Dk_KQ1et3OaV8CcT" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/quarto-tell-your-story/</guid>
  <pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/quarto-tell-your-story/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Build Automated, Tailored Marketing Dashboards for Optimized Marketing Spend</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/automated-tailored-shiny/</link>
  <description><![CDATA[ 




<a href="https://posit.co/workflow-demo/build-automated-tailored-marketing-dashboards-for-optimized-marketing-spend/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://ivelasq-2025-06-25-marketing-demo.share.connect.posit.cloud/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/2025-06-25_marketing-demo/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://www.youtube.com/watch?v=TL0OCJVDqtI" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://posit.co/events/">End-to-End Workflow With Posit Team</a>
</li>
<li>
📆 25 June 2025 // 11:00 AM ET
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Scenario: Imagine the weekly scramble at DemoCo. Isabella, a lonely Marketing analyst, spends hours every Friday manually compiling marketing lead performance data from Salesforce, website logs, and event records into a sprawling Excel report. The tedious, redundant process is both a time sink and a bottleneck.</p>
<p>Marketing Leadership, who need to identify top-performing platforms, find the mass amount of information in the report confusing. They constantly return to Isabella for clarification or, even worse, don’t reach back out and make misinformed decisions on critical budget allocation. Determined, Isabella decides it’s finally time to automate and tailor this critical dashboard, and save headaches for both Leadership and herself.</p>
<p>In this demo, you will learn how to:</p>
<ol type="1">
<li>Transform redundant, manual, error-prone data compilation into an automated lead performance dashboard with Shiny</li>
<li>Integrate diverse marketing data sources for a holistic view</li>
<li>Build tailored marketing KPI dashboards that address Leadership’s specific questions</li>
<li>Use drill-downs, data visualizations, and LLM-powered summaries to reduce data overload and clarify complex takeaways instantly</li>
<li>Provide flexibility in dashboard functionality to meet diverse preferences and needs, from pre-selected insights derived directly from the data to implementing an LLM-powered analytics option</li>
</ol>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://ivelasq-2025-06-25-marketing-demo.share.connect.posit.cloud/" height="415" width="800">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<iframe width="800" height="415" src="https://www.youtube.com/embed/TL0OCJVDqtI?si=-l2ZRNf14DqmrmxD" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/automated-tailored-shiny/</guid>
  <pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/automated-tailored-shiny/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Choosing the right tool for interactive dashboards: flexdashboard, Quarto, and Shiny</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/interactive-dashboard-tools/</link>
  <description><![CDATA[ 




<a href="https://www.shinyconf.com/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://ivelasq-shinyconf2025.share.connect.posit.cloud/#/section" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/shinyconf2025" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
🔔 <a href="https://www.shinyconf.com/">ShinyConf 2025</a>
</li>
<li>
📆 10 April 2025 // 07:10 AM CT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>The landscape of interactive dashboards is rich for R and Python users thanks to powerful tools like flexdashboard and Shiny. The release of Quarto v1.5 introduced built-in dashboard capabilities, presenting even more exciting possibilities. In this talk, we’ll compare each tool and provide practical heuristics to help you select the best option for your needs, whether you’re building lightweight reports, dynamic web apps, or something in between.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://ivelasq-shinyconf2025.share.connect.posit.cloud/#/section" height="415" width="800">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/interactive-dashboard-tools/</guid>
  <pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/interactive-dashboard-tools/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Brand your Quarto projects with brand.yml</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/brand-yml/</link>
  <description><![CDATA[ 




<a href="https://www.meetup.com/rladies-philly/events/306157885/?eventOrigin=group_events_list" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://ivelasq-branded-quarto.share.connect.posit.cloud/#/section" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/2025-03-12_branded-quarto/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://www.youtube.com/watch?v=mTuhQ64P3qc" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>  
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
🔔 <a href="https://www.meetup.com/rladies-philly/events/306157885/?eventOrigin=group_events_list">R-Ladies Philly</a>
</li>
<li>
📆 12 March 2025 // 11:00 AM CT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Maintaining a consistent brand identity across data science outputs is essential for clear communication and a professional image. This talk introduces <a href="https://posit-dev.github.io/brand-yml/">brand.yml</a>, a powerful new tool designed to streamline adherence to organizational style guides within the Quarto publishing system. brand.yml simplifies the creation of visually consistent materials that perfectly align with your organization’s brand guidelines in HTML reports, presentations, websites, and dashboards.</p>
<p>We’ll explore how brand.yml allows you to define your brand’s visual identity, including colors, fonts, logos, and more, in a single, centralized location. You will learn how to integrate this configuration file into your Quarto projects, automatically applying the defined style guide to various outputs like reports, presentations, websites, and more. Beyond basic integration, I’ll share practical tips and demonstrate tools that simplify the process of designing and managing your brand.yml file to make brand customization even easier.</p>
<p>Join us to discover how brand.yml can elevate your Quarto documents to a new level of professionalism to ensure that your work is more impactful and on-brand.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://ivelasq-branded-quarto.share.connect.posit.cloud/#/section" height="415" width="800">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<iframe width="800" height="450" src="https://www.youtube.com/embed/mTuhQ64P3qc?si=C0XeoBPmb6jY4NqG" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/brand-yml/</guid>
  <pubDate>Wed, 12 Mar 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/brand-yml/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Tidy Data, Weighted Insights: Analyzing Complex Survey Data in R</title>
  <dc:creator>Stephanie Zimmer</dc:creator>
  <dc:creator>Rebecca Powell</dc:creator>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/tidy-data-weighted-analysis/</link>
  <description><![CDATA[ 




<a href=" https://www.meetup.com/rladies-amsterdam/events/305454925/?eventOrigin=group_past_events" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://tidy-survey-r.github.io/site/talks/talk-rladies-ams-rtp.html#/title-slide" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://www.youtube.com/watch?v=ip78qoxoZGc" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>  
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.meetup.com/rladies-amsterdam/events/305454925/">R-Ladies Amsterdam</a> and <a href="https://www.meetup.com/rladies-rtp/events/305348585/">R-Ladies RTP</a>
</li>
<li>
📆 25 February 2025 // 11:00 AM CT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Surveys are powerful tools, but to ensure the accurate interpretation of results, they require specific analysis methods. With the {srvyr} package and {tidyverse} family of functions, we are able to analyze survey data with weights to derive meaningful results. Our new book, Exploring Complex Survey Data Analysis Using R, goes through how to do this step-by-step. You can view the book here: https://tidy-survey-r.github.io/tidy-survey-book/.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://tidy-survey-r.github.io/site/talks/talk-rladies-ams-rtp.html#/title-slide" height="415" width="800">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<p><iframe width="800" height="450" src="https://www.youtube.com/embed/ip78qoxoZGc?si=VOyMO3oDvUnd3KDA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></p>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/tidy-data-weighted-analysis/</guid>
  <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/tidy-data-weighted-analysis/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Interactive R, Python, and Shiny in the Browser with Quarto and Shinylive</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/interactive-r-python-in-browser/</link>
  <description><![CDATA[ 




<a href="https://www.meetup.com/rladies-rome/events/305741912/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://ivelasq.github.io/2025-02-21_r-python-shiny-in-the-browser/" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/2025-02-21_r-python-shiny-in-the-browser" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://www.youtube.com/watch?v=59DSo_jjTpI" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
🏛️ <a href="https://www.meetup.com/rladies-rome/events/305741912/">R-Ladies Rome</a>
</li>
<li>
📆 21 February 2025 // 11:00 AM CT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Discover new ways to share R, Python, and Shiny projects using Quarto Live and Shinylive, no server required!</p>
<p>These tools bring R, Python, and Shiny applications to life directly in the browser. Your audience can open a web page and instantly run code or interact with Shiny apps without needing any setup.</p>
<p>Quarto Live allows you to embed interactive code blocks, exercises with hints and solutions, and dynamic visualizations within static HTML documents. Powered by WebAssembly, it brings interactivity to your Quarto documents.</p>
<p>Shinylive transforms Shiny apps into fully browser-based experiences.</p>
<p>In this talk, you’ll learn how to use these tools to create engaging, interactive documents, dashboards, and educational content that anyone can access, even if they do not have R or Python installed. I look forward to seeing you there!</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://ivelasq.github.io/2025-02-21_r-python-shiny-in-the-browser/" height="415" width="800">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<p><iframe width="800" height="450" src="https://www.youtube.com/embed/59DSo_jjTpI?si=_v5t4Ebk1IUfscrM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></p>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/interactive-r-python-in-browser/</guid>
  <pubDate>Fri, 21 Feb 2025 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/interactive-r-python-in-browser/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>From Notebooks to Dashboards with Quarto</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <dc:creator>Sara Altman</dc:creator>
  <link>https://ivelasq.rbind.io/talk/smalldatasf-quarto-workshop/</link>
  <description><![CDATA[ 




<a href="https://www.smalldatasf.com/2024/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://pos.it/smalldatasf-quarto-workshop" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-link-45deg"></i>&nbsp;&nbsp;Website
</a>

<a href="https://github.com/posit-dev/smalldatasf-quarto-workshop" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>
    
<a href="https://github.com/posit-dev/smalldatasf-quarto-exercises" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-card-checklist"></i>&nbsp;&nbsp;Exercises
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.smalldatasf.com/2024/">Small Data SF 2024</a>
</li>
<li>
📆 23 September 2024 // 1:00 PM PT
</li>
<li>
🌉️ San Francisco, CA
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Quarto is an innovative, open-source publishing system from Posit that transforms Jupyter Notebooks and plain markdown into polished, professional outputs. This workshop will show how Quarto helps data scientists create high-quality, shareable dashboards with static and interactive features following an accessible and reproducible workflow.</p>
</section>
<section id="website" class="level2">
<h2 class="anchored" data-anchor-id="website"><a href="https://posit-dev.github.io/smalldatasf-quarto-workshop/" target="_blank">Website</a></h2>
<iframe src="https://posit-dev.github.io/smalldatasf-quarto-workshop/" width="800" height="1550">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/smalldatasf-quarto-workshop/</guid>
  <pubDate>Mon, 23 Sep 2024 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/smalldatasf-quarto-workshop/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Using pins for Shiny with ever-changing data</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/ever-changing-shiny/</link>
  <description><![CDATA[ 




<a href="https://www.meetup.com/posit-enterprise-community-meetup/events/299970474" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://0191902f-f29f-7d83-3606-3d3a013e33d5.share.connect.posit.cloud/#/title-slide" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/posit-marketing/shiny-calendar" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://www.youtube.com/watch?v=u2OK8IWJWhk" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>  
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.meetup.com/posit-enterprise-community-meetup/events/299970474">RStudio Enterprise Community Meetup</a>
</li>
<li>
📆 28 August 2024 // 11:00 AM CT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>Do you manage constantly changing data and need your Shiny app to automatically update?</p>
<p>On August 28th at 11 am ET, Isabella Velásquez demonstrated a streamlined workflow for handling frequently updated datasets in Shiny. You’ll see how to simplify your process for keeping dynamic data current and how to reflect those changes in your app or dashboard.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://0191902f-f29f-7d83-3606-3d3a013e33d5.share.connect.posit.cloud/#/title-slide" height="415" width="800">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<p><iframe width="800" height="450" src="https://www.youtube.com/embed/u2OK8IWJWhk?si=vogdpAKFZzUgGTNE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe></p>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/ever-changing-shiny/</guid>
  <pubDate>Wed, 28 Aug 2024 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/ever-changing-shiny/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Quarto Dashboards</title>
  <dc:creator>Isabella Velásquez</dc:creator>
  <link>https://ivelasq.rbind.io/talk/quarto-dashboards/</link>
  <description><![CDATA[ 




<a href="https://www.meetup.com/rladies-rome/events/302078218/" class="btn btn-secondary">
  <i class="bi bi-calendar-event"></i>&nbsp;&nbsp;Event
</a>

<a href="https://0190c2c9-dd44-d440-0f97-f3b3bf073d0f.share.connect.posit.cloud/#/title-slide" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-tv"></i>&nbsp;&nbsp;Slides
</a>

<a href="https://github.com/ivelasq/2024-07-18_quarto-dashboards" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-github"></i>&nbsp;&nbsp;Repo
</a>

<a href="https://www.youtube.com/watch?v=Kq1hgg2NtE4" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">
  <i class="bi bi-youtube"></i>&nbsp;&nbsp;Recording
</a>
<p><br></p>
<section id="details" class="level2">
<h2 class="anchored" data-anchor-id="details">Details</h2>
<ul style="list-style-type: none; padding-left: 0;">
<li>
👥 <a href="https://www.meetup.com/rladies-rome/events/302078218/">R-Ladies Rome</a>
</li>
<li>
📆 18 July 2024 // 11:00 AM CT
</li>
<li>
💻️ Virtual
</li>
</ul>
</section>
<section id="description" class="level2">
<h2 class="anchored" data-anchor-id="description">Description</h2>
<p>In this workshop, you’ll dive into the world of Quarto, exploring how to create dynamic and interactive dashboards for data visualization. Whether you’re a beginner or seasoned developer, this session promises to enhance your skills and empower you with practical knowledge.</p>
</section>
<section id="slides" class="level2">
<h2 class="anchored" data-anchor-id="slides">Slides</h2>
<iframe src="https://0190c2c9-dd44-d440-0f97-f3b3bf073d0f.share.connect.posit.cloud/#/title-slide" height="415" width="800">
</iframe>
</section>
<section id="recording" class="level2">
<h2 class="anchored" data-anchor-id="recording">Recording</h2>
<iframe width="800" height="415" src="https://www.youtube.com/embed/Kq1hgg2NtE4?si=PQ9R4SrVHrH14Djq" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>


</section>

 ]]></description>
  <guid>https://ivelasq.rbind.io/talk/quarto-dashboards/</guid>
  <pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate>
  <media:content url="https://ivelasq.rbind.io/talk/quarto-dashboards/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
</channel>
</rss>
