
Nueve bloques de código, pegados uno debajo del otro, cambiando solo el nombre del archivo cada vez: así tenía guardado mi primer intento serio de procesar un grupo de imágenes Landsat en R. Nueve, no dos ni tres, porque cada vez que quería sumar otra imagen a la carpeta —quería ver cómo iba cambiando el bosque que se asoma sobre el río Calle-Calle, acá en Valdivia— copiaba el bloque completo de nuevo, letra por letra, convencida de que así se hacía la teledetección cuando una no es programadora de oficio. Ese es justo el mito que quiero desarmar en esta entrada, porque me costó tardes enteras perdidas creérmelo y todavía veo a gente autodidacta cayendo en lo mismo: la idea de que para procesar varias imágenes satelitales en R hace falta escribir código complicado o repetir el mismo proceso a mano, imagen por imagen, en vez de dejar que un bucle sencillo haga el trabajo por una.
Antes de llegar a los bucles probé de todo un poco. Seguí un tutorial de QGIS que encontré por ahí, pero me perdí entre menús desde el primer clic y cerré el programa más perdida que al principio. Volví a R porque ahí al menos sentía que entendía lo que estaba escribiendo, aunque fuera a fuerza de repetir el mismo bloque una y otra vez. El problema real nunca fue que me faltaran estudios de programación: era que no sabía que existía una forma de decirle a R "toma esta lista de archivos y hazles lo mismo a todos", que es, en el fondo, todo lo que es un bucle.
Para procesar muchas imágenes satelitales no necesitas saber programar

La función que me sacó del hoyo se llama list.files(), y lo único que hace es entrar a una carpeta y devolver un listado de todo lo que termina en .tif, ordenado y listo para usar. Con esa lista armada, un bucle for es más simple de lo que suena: es una receta que dice "toma el primer archivo, hazle esto, después toma el segundo, hazle lo mismo, y sigue así hasta que se acabe la lista". Uso el paquete terra para leer cada raster dentro del bucle porque es rápido y no complica la sintaxis, aunque cuál paquete conviene para cada tarea es una conversación aparte que da para su propia entrada. Lo que sí quiero dejar claro es que nunca tuve que escribir "imagen 1", "imagen 2" y así hasta la veinte; el bucle se encarga solo de ir cambiando el archivo, uno por uno.
Ahora, ojo con algo: si mezclas imágenes de distintos satélites dentro del mismo bucle, como Sentinel-2 con Landsat, te vas a topar con que las resoluciones espaciales no calzan y el proceso se cae a la mitad sin avisar. A mí me pasó justo eso al combinar ambas fuentes, y tuve que resolverlo por el lado del remuestreo, algo que dejé explicado con calma en otra entrada sobre cómo cambiar la resolución de un raster en R con remuestreo espacial. La proyección de cada imagen es otro tema que puede reventarte el bucle si no la revisas antes, pero eso ya es material para otro día porque da para mucho más de una frase.
El bucle for, explicado como una receta de cocina
Escribo esto sentada en el escritorio de mi pieza, en un departamento del centro de Valdivia, con el monitor prestado que uso de segunda pantalla y una taza de café que ya se enfrió hace rato al lado del trackpad. Afuera llovía sobre el vidrio empañado del patio interior, y adentro la barra de carga del raster llevaba minutos sin moverse ni un poquito, como si el programa también estuviera dudando qué hacer con el temporal. Cuando por fin terminó de cargar, ahí estaba: el contorno del río Cruces dibujado en un verde nítido sobre el gris del resto de la imagen, tan claro que se me olvidó por un rato que llevaba media tarde peleando para que el bucle no se cayera a la primera.

Ese bucle en particular no calculaba nada complicado: solo leía un raster, sacaba un valor de vegetación y guardaba el resultado en una carpeta nueva antes de pasar al siguiente archivo. Nada de programación avanzada, nada de fórmulas eternas escritas de memoria cada vez. Lo más parecido a magia que tiene un bucle for es que, una vez armado, una aprieta "Run" y se puede ir a la cocina a buscar algo calentito mientras la consola trabaja sola.
El código feo también sirve (y funciona igual)
Aquí va el segundo mito que hay que tirar a la basura: que el código automatizado tiene que verse profesional para funcionar. El mío tiene nombres de variables medio ridículos, como "imagen_lista_ahora_si", y comentarios que me dejé a mí misma para no perderme la próxima vez que lo abra. Ninguno de esos detalles le importa a R. Lo que le importa es que la sintaxis esté bien cerrada, que cada paréntesis tenga su pareja y que la ruta de la carpeta esté escrita tal cual existe en el computador.
Me tocó pasar una tarde entera mirando fijo un error de "subscript out of bounds", convencida de que mi código estaba bien, hasta que descubrí que me faltaba un paréntesis al final de la ruta del archivo. Un solo paréntesis, nada más. Esa clase de cosas no las cuenta ningún tutorial rápido: que buena parte del tiempo de quien recién empieza se va en cazar un signo de puntuación perdido y no en entender el concepto en sí. Y mi laptop tampoco aguantaba siempre bien la carga: cuando las imágenes pesaban mucho, el bucle se ponía lento y el ventilador sonaba como si fuera a despegar, porque terra también tiene formas más eficientes de procesar datos sin ir archivo por archivo de forma tan explícita, aunque para empezar un bucle sencillo alcanza de sobra.
Antes de soltar el bucle con todo, prueba con dos imágenes
La regla que sí me ha servido, y que le paso a cualquiera que me pregunta, es simple: antes de correr el bucle sobre las veinte o treinta imágenes de la carpeta completa, pruébalo con dos nomás. Si el resultado de esas dos se ve bien, con el nombre correcto y guardado donde corresponde, el resto va a funcionar igual. Si algo sale mal, es mucho más fácil encontrar el error en dos archivos que en veinte. A Raimundo, un conocido del grupo de senderismo que anda siempre con la cámara fotografiando hongos, se lo expliqué así una tarde en que me preguntó cómo hacía yo para no perder la cabeza revisando tantas fotos del bosque a lo largo del tiempo; a él la paciencia no le falta nunca en el campo, pero apenas ve una pantalla llena de código se le acaba de inmediato, así que la idea de probar con solo dos imágenes antes de soltar el bucle con todo fue lo único que de verdad le hizo sentido.
Ese mismo esqueleto de bucle después me sirvió para hartas cosas más: para recortar cada imagen según el límite de una cuenca en vez de trabajar con el archivo completo, para sacar las nubes antes de calcular cualquier índice, para ir extrayendo valores en un mismo punto fijo a través de varias fechas y compararlos después en una tabla, e incluso para armar mapas finales con el mismo estilo cada vez sin tener que diseñar cada uno a mano. También lo usé para clasificar coberturas del suelo imagen por imagen, aunque validar que esa clasificación quedó bien hecha es un tema que da para una entrada aparte. Lo de la memoria del computador es otra cosa que hay que cuidar cuando los archivos pesan mucho, pero tampoco es algo que se resuelva en una sola frase. Y para quien recién está bajando sus primeras imágenes, o pensando en modelar dónde aparece tal o cual especie con estos datos, el bucle llega después, no antes: primero hay que tener las imágenes ordenadas y entendidas.

Lo que un bucle no te resuelve solo
Adentro del mismo bucle metí después el cálculo del NDVI, ese índice que uso para ver qué tan verde y sana se ve la vegetación en cada imagen, sin necesidad de tocar la fórmula a mano cada vez. Cada imagen de Landsat trae varias bandas espectrales metidas adentro, como capas que hay que saber elegir bien, aunque ese tema también da para su propia conversación. Tener todo esto automatizado fue lo que hizo que retomar lo que escribí sobre cómo detectar la pérdida de bosque con imágenes Landsat en RStudio se sintiera mucho menos pesado, porque ya no me quedaba pegada en la parte técnica y podía enfocarme en mirar el paisaje cambiar de verdad. Cuando quise ir un poco más allá probé también el SAVI, un índice que ayuda cuando hay mucho suelo desnudo entre la vegetación, siguiendo lo que ya había anotado sobre cómo calcular el índice de vigor de la vegetación SAVI en RStudio.
Isidora, una compañera que anda en este mismo camino autodidacta y que estudia biología en Concepción, me escribió hace poco preguntando básicamente lo mismo que me preguntaba yo al principio: si necesitaba saber programar en serio antes de meterse a hacer esto para su tesis. Ella anota todo en un cuaderno de papel y después lo escanea, así que le dije que hiciera lo mismo con los bucles: que escribiera a mano, paso a paso, qué quería que pasara con cada imagen antes de traducirlo a código, porque ahí es donde de verdad se entiende la lógica y no en la sintaxis. Ni ella ni yo llegamos a esto sabiendo programar, y ese es justo el punto: un bucle for no es una herramienta de gente con estudios de informática, es apenas una forma ordenada de no repetir a mano lo que ya sabes hacer una vez. Si te da miedo probarlo, arma tu lista de archivos, escribe el proceso una sola vez y pruébalo con dos imágenes antes de soltarlo con la carpeta entera; el resto es cosa de paciencia y de aguantar alguna tarde de lluvia mirando la consola trabajar sola.