Condicionales y bucles

Son parte fundamental de cualquier lenguaje. Sin ellas, las instrucciones de un programa sólo podrían ejecutarse en el orden en que están escritas (orden secuencial). Las estructuras de control permiten modificar este orden. Hay dos categorías de estructuras de control:

Condicionales o bifurcaciones: permiten que se ejecuten conjuntos distintos de instrucciones, en función de que se verifique o no determinada condición.

Estructura condicional simple IF: Este es el tipo más sencillo de estructura condicional. Sirve para implementar acciones condicionales del tipo siguiente:

Si se verifica una determinada condición, ejecutar una serie de instrucciones y luego seguir adelante.

Si la condición NO se cumple, NO se ejecutan dichas instrucciones y se sigue adelante.

La sintaxis en R es como sigue:

if(condición 1) {
resultado 1
}

Ejemplo

Como ejemplo de utilización de este tipo de condicional, se considera el cálculo del valor en un punto x de una función definida por partes, como por ejemplo:

\[f(x)=\begin{cases} 0\quad si\quad x\le 0 \\ { x }^{ 2 }\quad si\quad x>0 \end{cases}\quad \]

x <- 15;f <- function(x){0}
if(x>0) {
          f <- function(x){x^2}
        }
paste("El valor de f es ",f(x))
## [1] "El valor de f es  225"

Estructura condicional doble IF - ELSE :

Este tipo de estructura permite implementar condicionales en los que hay dos acciones alternativas:

Si se verifica una determinada condición, ejecutar un serie de instrucciones (bloque 1).

Si no , esto es, si la condición NO se verifica, ejecutar otra serie de instrucciones (bloque 2). En otras palabras, en este tipo de estructuras hay una alternativa: se hace una cosa o se hace la otra. En ambos casos, se sigue por la instrucción siguiente a la estrucutra IF - ELSE.

La sintaxis en R es como sigue:

if(condición 1) {
result 1
} else {
resultado 2
}

Ejemplo

La raíz \(n\)-ésima (real) depende de si \(n\) es par o impar. La fórmula sign(x)*abs(x)^(1/n) sirve para el caso par o el caso impar, excepto en el caso que n sea par y x < 0, es decir, la fórmula sirve si n es impar o x>=0, en otro caso nos queda una expresión indefinida.

raiz = function(n,x){
if(n%%2 == 1 || x >=0 ){
  sign(x)*abs(x)^(1/n) 
  } else{ 
    NaN }
                    }

raiz(5, -32) # raíz quinta de -32
## [1] -2

Estructura condicional múltiple IF - ELSEIF - ELSE : En su forma más general, la estructura IF - ELSEIF - ELSE: permite implementar condicionales más complicados, en los que se “encadenan” condiciones en la forma siguiente:

Si se verifica la condición 1, ejecutar las instrucciones del bloque 1.

Si no se verifica la condición 1, pero SI se verifica la condición 2 , ejecutar las instrucciones del bloque 2 .

Si no, esto es, si no se ha verificado ninguna de las condiciones anteriores, ejecutar las instrucciones del bloque 3. En cualquiera de los casos,elflujo del programa continuá por lainstrucción siguiente a la estructura IF - ELSEIF - ELSE.

La sintaxis en R es como sigue:

if(condición 1) {
result 1
} else if (condición 2) {
resultado 2
} else {
resultado 3
}

Ejemplo

Determinación del signo de un número: positivo, negativo o nulo.

x <- 5
if(x>0) {
"el número, es positivo"
} else if (x<0) {
"el número, es negativo"
} else {
"el número, es nulo"
}
## [1] "el número, es positivo"

La función raiz(n, x) del ejemplo anterior no está implementada para aplicarla a un vector x. Condicionales y vectores. ifelse() aplica un condicional a vectores. Si necesitamos usar las conectivas AND u OR, es preferible usar la “forma corta”: & o | respectivamente, porque esta forma de ambas conectivas permite recorrer vectores. La sintaxis es

ifelse(condición sobre vector, salida 1, sino salida 2)

a <- c(1, 1, 0, 1)
b <- c(2, 1, 0, 1)
# --- compara elementos de a y b
ifelse(a == 1 & b == 1, "Si", "No")
## [1] "No" "Si" "No" "Si"
# Observe que ifelse(a == 1 && b == 1, "Si", "No") retorna "NO" solamente.

Ahora podemos implementar la raíz \(n\)-énesima de manera que se pueda aplicar a vectores,

raiz = function(n,x){
ifelse(n%%2==1 | x>0, sign(x)*abs(x)^(1/n), NaN) #else: n par y x negativo
}
# pruebas
raiz(3, c(8, -8, -27, 27))
## [1]  2 -2 -3  3
raiz(4, c(-64, 64, -32, 32))
## [1]      NaN 2.828427      NaN 2.378414

Ciclo for. La sintaxis es como sigue:  Código R 1.29: for (contador-vector) { Instrucción }

Detener un ciclo. Se usa la intrucción break para detener el ciclo (actual). También se puede usar stop (…) y lanzar un mensaje de error.  Código R 1.31: “break” y “stop()”

for (i in 1:10){
if (i == 4) break
print(i) # se detiene en i=4, así que solo imprime hasta 3
}
## [1] 1
## [1] 2
## [1] 3

— Usar stop() para indicar un error

f<-function(x){x+5}
a<-5
b <-(-6)
if (f(a)*f(b)>0) stop("Se requiere cambio de signo") #Mensaje de error

while. La sintaxis es  Código R 1.32: while while (condición) { cuerpo } Por ejemplo,

x <- 1
while (x <= 5)
{
print(x)
x <- x + 1 # esta es la manera de incrementar en R (no hay x++)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

repeat. La sintaxis es  Código R 1.34: repeat{ … instrucciones … # until – criterio de parada if (condition) break }

sum = 0
repeat{
sum = sum + 2;
cat(sum); #concatena los resultados
if (sum > 11) break;
}
## 24681012
preg <- function() {
  R <- 0 # Preparación
  while (R != 3.1415) { # Inicio del loop (while)
    cat("Escriba el valor de PI hasta el 4to. decimal: ") # Plantea el problema
    R <- readLines(n = 1) # Toma la respuesta del usuario
    R <- as.numeric(R)    # Convierte la respuesta en numeric
    if (R == 3.1415) # Condicional 1
      break  # Corta y termina el loop
    if (R > 3.1415) { # Condicional 2
      cat(" -- ese valor es muy ALTO ... intente de nuevo!\n") # Respuesta 1
    } else {
      cat(" -- ese valor es muy BAJO ... intente de nuevo!\n") # Respuesta 2
    }
  } # Fin del loop (while)
  cat("¡Es correcto!\n") # Respuesta 3 / Salida
} # 
Nota: Gran parte de este trabajo fue tomado de https://tecdigital.tec.ac.cr/revistamatematica/ Cómo utilizar R en métodos numéricos Walter Mora F. wmora2@gmail.com Escuela de Matemáticas Instituto Tecnológico de Costa Rica