9.3 while
Este es un tipo de bucle que ocurre mientras una condición es verdadera (TRUE
). La operación se realiza hasta que se se llega a cumplir un criterio previamente establecido.
El modelo de while es:
while(condicion) {
operaciones }
Con esto le decimos a R:
- MIENTRAS esta condición sea VERDADERA, haz estas operaciones.
La condición generalmente es expresada como el resultado de una o varias operaciones de comparación, pero también puede ser el resultado de una función.
9.3.1 Usando while
Probemos sumar +1
a un valor, mientras que este sea menor que 5. Al igual que con for
, necesitamos la función print()
para mostrar los resultados en la consola.
<- 5
umbral <- 0
valor
while(valor < umbral) {
print("Todavía no.")
<- valor + 1
valor }
## [1] "Todavía no."
## [1] "Todavía no."
## [1] "Todavía no."
## [1] "Todavía no."
## [1] "Todavía no."
¡Ten cuidado con crear bucles infinitos! Si ejecutas un while
con una condición que nunca será FALSE
, este nunca se detendrá.
Si corres lo siguiente, presiona la tecla ESC para detener la ejecución, de otro modo, correrá por siempre y puede llegar a congelar tu equipo.
while(1 < 2) {
print("Presiona ESC para detener")
}
El siguiente es un error común. Estamos sumando 1 a i
con cada iteración del bucle, pero como no estamos asignando este nuevo valor a i
, su valor se mantiene igual, entonces la condición nunca se cumplirá y el bucle será infinito.
De nuevo, si corres lo siguiente, presiona la tecla ESC para detener la ejecución.
<- 0
i while(i < 10) {
+ 1
i }
Un uso común de while es que realice operaciones que queremos detener cuando se cumple una condición, pero desconocemos cuándo ocurrirá esto.
Supongamos que, por alguna razón queremos sumar calificaciones, del 1 al 10 al azar, hasta llegar a un número que mayor o igual a 50. Además nos interesa saber cuántas calificaciones sumaron y cuál fue el resultado al momento de cumplir la condición.
Para obtener números al azar del 1 al 10, usamos la función sample()
. Esta función va a tomar una muestra al azar de tamaño igual a 1 (argumento size
) de un vector del 1 al 10 (argumento x
) cada vez que se ejecute.
Por lo tanto, cada vez que corras el ejemplo siguiente obtendrás un resultado distinto, pero siempre llegarás a un valor mayor a 50.
Creamos dos objetos, conteo
y valor
. Les asignamos el valor 0.
<- 0
conteo <- 0 valor
Nuestro while
hará dos cosas.
Primero, tomará un número al azar del 1 al 10, y lo sumará a valor
. Segundo, le sumará 1 a conteo
cada que esto ocurra, de esta manera sabremos cuántas iteraciones ocurrieron para llegar a un valor que no sea menor a 50.
while(valor < 50) {
<- valor + sample(x = 1:10, size = 1)
valor <- conteo + 1
conteo }
Aunque no son mostrados en la consola los resultados son asignados a los objetos valor
y conteo
valor
## [1] 51
conteo
## [1] 13
Por último, si intentamos ejecutar un while
para el que la condición nunca es igual a TRUE
, este no realizará ninguna operación.
<- 0
conteo
while("dado" == "ficha") {
<- conteo + 1
conteo
}
conteo
## [1] 0