Bucle while en R
Un bucle while en R es una función diseñada para ejecutar algún código hasta que se cumpla una condición. Mientras la condición lógica sea TRUE, el código no dejará de ejecutarse. Este tipo de bucle es muy útil para estudios de simulación. El bucle while es muy similar al bucle for, salvo que en éste no definirás el número total de iteraciones a ejecutar.
Sintaxis del bucle while
El bucle while ejecutará algún código mientras se cumpla una condición lógica. Por lo tanto, mientras la condición sea TRUE
, R seguirá ejecutando el código en ciclo. Para realizar un bucle while necesitas usar la función while
, que tiene la siguiente sintaxis:
while (condición_lógica) {
# Código
}
¡Ten cuidado! Los bucles while pueden no parar nunca si la condición lógica no deja de cumplirse.
Ejemplos de uso de los bucles while en R
En esta sección, mostraremos algunos casos de uso para comprender mejor los bucles while.
Factorial en R usando los bucles while
El factorial de un entero no negativo es la multiplicación de los enteros desde ese número hasta 1. En matemáticas se denota por !
. Como ejemplo, el factorial de 3 es 3! = 3 \(\cdot\) 2 \(\cdot\) 1 = 6. Recuerda que el factorial de 0 es 1.
factorialR <- function(x) {
if (x == 0) {
res <- 1
} else {
res <- x
while(x > 1){
res <- (x - 1) * res
x <- x - 1
}
}
return(res)
}
factorialR(8)
factorialR(0)
40320
1
Sin embargo, debe mencionarse que estos resultados podrían lograrse de diferentes maneras. De hecho, en R ya existe una función base denominada factorial
, que es más eficiente que la de nuestro ejemplo, ya que está escrita en C.
Primer cuadrado que excede un número con el bucle while
Supongamos que queremos saber el primer número entero positivo cuyo cuadrado excede 4000. Para ello podríamos escribir:
# Inicializamos las variables
n <- 0
cuadrado <- 0
# Bucle while
while(cuadrado <= 4000) {
n <- n + 1
cuadrado <- n ^ 2
}
# Resultados
n # 64
cuadrado # 4096
Suma de dos vectores
Como último ejemplo, podemos crear un bucle while en R que sume dos vectores. En este caso, vamos a sumar los vectores llamados x
e y
.
x <- c(1, 2, 3, 4)
y <- c(0, 0, 5, 1)
n <- length(x)
i <- 0
z <- numeric(n)
while (i <= n) {
z[i] <- x[i] + y[i]
i <- i + 1
}
z
1 2 8 5
Obviamente, esto podría lograrse solo con el operador +
.
Simulación de n lanzamientos aleatorios dentro de un círculo
Supón que quieres simular n lanzamientos aleatorios dentro de un círculo de radio r. Para ello puedes hacer lo siguiente:
n <- 5 # Número de lanzamientos
radio <- 1 # Radio del círculo
contador <- 0
datos <- matrix(nrow = n, ncol = 2)
while (contador < n) {
xaux <- runif(2, min = -radio, max = radio)
if (sqrt(xaux[1] ** 2 + xaux[2] ** 2) < radio) {
contador <- contador + 1
datos[contador, ] <- xaux
}
}
datos
[, 1] [, 2]
[1,] 0.7228765 -0.3418237
[2,] -0.1762560 -0.9262462
[3,] 0.7169295 0.2026573
[4,] -0.3739910 0.2346970
[5,] 0.4458186 -0.6395707