En esta parte veremos 3 esquemas:
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.
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]
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.