Herramientas Computacionales
para la Investigación Interdisciplinaria Reproducible


Sesión 2: Introducción al R

Part B: Control de Ejecución

En esta parte veremos 3 esquemas:

  1. Ejecución Condicional.
  2. Loops.
  3. Manejo de Errores.

Ejecución Condicional.

Es la situación donde el programa ejecuta alguna sección del código, dependiendo si alguna condición se cumple o no:

value=-100

#condicion
if (value >= 0){ 
  # si es Verdadero
  rootValue=sqrt(value)
  print (rootValue)
} else {  
  # si es Falso
  print('Lo lamento, no calculo raíces cuadradas de números negativos')
}

Nótese el uso parentesis en la condición. Además, el uso de {} para identificar secciones de comandos (opcional aquí por haber una sola linea de comando). Sin la sección del else{} el programa funciona, pero no habrá mensaje de por qué no hay resultado mostrado.

Ir a inicio


Loops

Aquí le dices a la computadora cómo hacer algo muchas veces; así como indicarle cuándo dejara de hacerlo:

values=c(9,25,100)
for (value in values){ # mientras hayan valores en 'values'
  print(sqrt(value))
}

Arriba, el código muestra el resultado, pero si deseas sólo guardalo:

values=c(9,25,100)
rootValues=c() # creando vector vacío

for (value in values){
  rootValues=c(rootValues,sqrt(value)) # actualizando vector
}
# si quieres verlos:
rootValues

Es evidente que si combinamos for e if-else tendremos mejores programas:

values=c(9,25,-100,144,-72)
rootValues=c()
for (value in values){
  if (value >=0){
    rootValues=c(rootValues,sqrt(value))
  }else {
    print("Puse un NaN, lo verás luego...")
    rootValues=c(rootValues,NaN)
  }
}
# to see the results:
rootValues

Si deseas detener la ejecución, usa break:

values=c(9,25,-100,144,-72)
rootValues=c()
for (value in values){
  if (value <0){
    print('Mejor me detengo, se ha ingresado un valor inválido')
    break
  }
  rootValues=c(rootValues,sqrt(value))
}
rootValues

El comando next puede ser útil para usar toda la data aun cuando hay errores:

values=list(9,NA,NaN,Inf,'1000',-100,144,-72)
for (value in values){
  if (is.na(value)){
    print('Encontré un NA o NaN...no haré nada')
    next
  }
  
  if (is.infinite(value)){
    print('Encontré un Inf...no haré nada')
    next
  }
  if (value <0){
    print('Encontré un negativo...no haré nada')
    next
  }
  
  if (is.character(value)){
    print('Encontré un texto...no haré nada')
    next
  }
  rootVal=sqrt(value)
  print(paste(rootVal,'es la raíz de ',value))
}

Note las diferencias para valores no numéricos:

0/0 # no es NA, sino NaN
1/0 # no es NaN, sino Inf

A veces, quieres contar un valor particular:

values=c(9,25,-100,144,-72)
counterOfInvalids=0 # el contador se inicializa
for (value in values){
  if (value < 0){
    counterOfInvalids=counterOfInvalids+1 #incrementando contador
  }
}

# ver:

counterOfInvalids

Este código te enseña a guardar posiciones:

values=c(9,25,-100,144,-72)
positionInvalids=c()
currentPosition=1  # posición inicial (de arranque)
for (value in values){
  if (value < 0){
    positionInvalids=c(positionInvalids,currentPosition)
  }
  currentPosition=currentPosition+1 # atención dónde pones esto!
}
positionInvalids 

# a ver:
values[positionInvalids]

Ir a inicio


Manejo de errores

Hemos controlado errores antes con if-else; veamos unas situaciones alternativas.

Primero los casos:

sqrt(-10)  #NaN es el resultado
sqrt('10') # no lo puede ejecutar

Veamos:

value =-100

tryCatch(
  #parte 1: si no hay problema
  print(sqrt(value)),
  #part 2: si se ejecuta con advertencia
  warning = function(w) {print(paste(value, "valor equivocado!"))},
  #part 3: se nos da error
  error = function(e) {print(paste(value,"se recibió texto!"))} 
  )


AUSPICIO:

El desarrollo de estos contenidos ha sido posible gracias al grant del Berkeley Initiative for Transparency in the Social Sciences (BITSS) at the Center for Effective Global Action (CEGA) at the University of California, Berkeley

RECONOCIMIENTO

El autor reconoce el apoyo que el eScience Institute de la Universidad de Washington le ha brindado desde el 2015 para desarrollar su investigación en Ciencia de Datos.