Tracks
/
R
R
/
Temario
/
Condicionales
Co

Condicionales en R

2 ejercicios

Acerca de Condicionales

Operadores de comparación

R tiene un conjunto de operadores que es el mismo que el de muchos otros lenguajes:

1 == 2 # FALSE
1 != 2 # TRUE
1 < 2 # TRUE
1 > 2 # FALSE
1 <= 2 # TRUE
1 >= 2 # FALSE

Ramificación

La forma básica de un if-then-else es:

if (x > 10) {
    y <- "big"
} else if (x > 2) {
    y <- "medium"
} else {
    y <- "tiny"
}

En este caso, son obligatorios tanto los paréntesis ( ) alrededor de la condición booleana como las llaves { } alrededor del cuerpo.

Una instrucción if simple se puede acortar:

if (x == 0) return("success")

Uso de vectores en condicionales

Como anticipo del concepto vector-filtering: la cláusula condicional entre paréntesis () debe evaluarse a un único TRUE/FALSE.

Incluir vectores en la comparación suele dar como resultado un vector de booleanos, así que habrá que envolverlos en una función de agregación como all() (¿son todos los valores TRUE?) o any() (¿es TRUE al menos un valor?).

numbers <- c(4,5,7,9,10,11)
numbers %% 3 == 0 # gives vector of booleans
#> [1] FALSE FALSE FALSE  TRUE FALSE FALSE

# use any() to get a single TRUE/FALSE
if (any(numbers %% 3 == 0)) print("1 or more numbers are divisible by 3")
#> [1] "1 or more numbers are divisible by 3"

La función ifelse

Una forma alternativa de if-else puede resultar útil, siempre que solo haya un resultado verdadero o falso.

y <- ifelse(x > 8, "big", "small")

# Don't mix result types:
z <- ifelse(x > 100, 100, "small") # numeric or string result? Expect problems!

ifelse() toma exactamente tres parámetros:

  1. cláusula booleana
  2. el valor si TRUE
  3. el valor si FALSE.

Se aceptan entradas vectoriales, y en ese caso se produce una salida vectorial. En este caso, asegúrate de que ambas ramas den como resultado el mismo tipo de datos: numérico, carácter, lógico, etc. Esto se tratará en el concepto vector-functions.

Los dos resultados ("big", "small" en el ejemplo anterior) deberían ser valores únicos. Lamentablemente, dar un vector más largo aquí probablemente hará que R haga algo confuso e inesperado, sin mostrar ningún mensaje de advertencia.

La función if_else

Antecedentes

Los responsables del lenguaje R tienen como política evitar en la medida de lo posible los cambios que rompen la compatibilidad. Esto ayuda a mantener la enorme cantidad de paquetes de terceros disponibles en CRAN, pero limita la capacidad de actualizar R base con conceptos de programación modernos.

En los últimos años se han publicado varios paquetes que amplían y, a veces, sustituyen funcionalidades de R, basados en décadas de experiencia sobre los puntos fuertes y débiles del diseño original de R.

Estos paquetes forman la colección tidyverse. Se añadieron al test runner de Exercism en 2023 y están disponibles para que los uses en los ejercicios.

Nuestro track de R es varios años anterior a la incorporación del tidyverse, así que puede que notes que muchas soluciones de la comunidad se ciñen al lenguaje base.

El paquete dplyr

dplyr sirve sobre todo para manipular dataframes (se tratará más adelante en el curso).

Añádelo con library(dplyr) al principio de tu código, o con library(tidyverse) para añadir la colección completa. Puede que veas mensajes de advertencia sobre nombres enmascarados, pero rara vez es un problema.

Para el concepto actual, merece la pena mencionar la función if_else. Es en gran medida similar a ifelse de R base.

library(dplyr) # warnings not shown

x <- 10
if_else(x > 8, "big", "small")
#> [1] "big"

La principal diferencia es que if_else puede tomar un cuarto argumento opcional, para los valores ausentes que en R se representan con NA.

xs <- c(3, NA, 10, NA, 4)  # a 5-element vector
xs
#> [1]  3 NA 10 NA  4
if_else(xs > 8, "big", "small", "missing")
#> [1] "small"   "missing" "big"     "missing" "small" 

# contrast:
ifelse(xs > 8, "big", "small")
#> [1] "small" NA      "big"   NA      "small"

También puede que descubras que if_else tiene mensajes de error mucho mejores que el antiguo ifelse.

Después de cargar la librería dplyr, también tendrás acceso a la función between().

R no permite encadenar comparaciones, así que 1 <= x <= 5 dará un mensaje de error. Con dplyr cargado, between(x, 1, 5) es equivalente a x >= 1 & x <= 5, y quizá más legible. Tanto el límite inferior como el superior están incluidos.

Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Condicionales