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

Bifurcació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, se requieren tanto los paréntesis ( ) alrededor del Boolean como las llaves { } alrededor del cuerpo.

Una sentencia if simple se puede acortar:

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

Usar vectores en condicionales

Adelantándonos al concepto vector-filtering: la cláusula condicional entre paréntesis () debe evaluar a un único TRUE/FALSE.

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

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 ser útil, siempre que solo haya un resultado de 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. la cláusula Boolean
  2. el valor si TRUE
  3. el valor si FALSE.

Se aceptan argumentos 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 cubrirá en el concepto vector-functions.

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

La función if_else

Antecedentes

Quienes mantienen el lenguaje R tienen la política de 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 posibilidad 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, reemplazan funcionalidades de R, basados en décadas de experiencia sobre las fortalezas y debilidades del diseño original de R.

Estos paquetes forman la colección tidyverse. Se agregaron al ejecutor de pruebas 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 quedan con el lenguaje base.

El paquete dplyr

dplyr se ocupa principalmente de manipular dataframes (lo veremos más adelante en el curso).

Agrégalo con library(dplyr) al inicio de tu código, o con library(tidyverse) para agregar toda la colección. Es posible que veas mensajes de advertencia sobre nombres enmascarados, pero rara vez es un problema.

Para este concepto, vale la pena mencionar la función if_else. Es en gran medida similar a ifelse en 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 faltantes 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 ifelse más antiguo.

Después de cargar la biblioteca 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 son inclusivos.

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

Aprende Condicionales