Operadores lógicos y de comparación Juan José de Haro Contents 1 Operadores de comparación 2 2 Operadores lógicos 3 2.1 Ejemplo ‘&’: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 Ejemplo ‘&&’: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.3 Ejemplo ‘|’: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.4 Ejemplo ‘||’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3 Funciones relacionadas 5 3.1 isTRUE() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.2 all.equal() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.3 any() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.4 all() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 4 Estructuras de control 7 4.1 if() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4.2 for() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4.3 while() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 4.4 repeat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.5 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.6 next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 4.7 ifelse() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 4.8 switch() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1 1 Operadores de comparación Devuelven TRUE si la compración es cierta y FALSE si no lo es • • • • • • == Igual ! = Distinto > Mayor que >= Mayor o igual que < Menor que <= Menor o igual que 7 == 4 ## [1] FALSE 7 != 4 ## [1] TRUE 6 > 6 ## [1] FALSE 6 >= 6 ## [1] TRUE 7 < 8 ## [1] TRUE 7 <= 8 ## [1] TRUE 2 2 Operadores lógicos • ‘&’ Y lógico aplicado a cada elemento de un vector. Opera con varios elementos a la vez por lo que devuelve varios valores TRUE y/o FALSE. • ‘&&’ Y lógico aplicado al primer elemento de un vector (a un único número). Opera con un único número a la vez (o el primer elemento de un vector), sólo devuelve un valor TRUE o FALSE. • ‘|’ O lógico aplicado a cada elemento de un vector. Opera con varios elementos a la vez por lo que devuelve varios valores TRUE y/o FALSE. • ‘||’ O lógico aplicado al primer elemento de un vector (a un único número). Opera con un único número a la vez (o el primer elemento de un vector), sólo devuelve un valor TRUE o FALSE. 2.1 Ejemplo ‘&’: set.seed(101) x <- trunc(runif(10, 1, 10)) y <- trunc(runif(10, 1, 10)) x; y ## [1] 4 1 7 6 3 3 6 4 6 5 ## [1] 8 7 7 9 5 6 8 3 4 1 x > 5 & x == y ## # Muestra todos los elementos indicando si se cumple o no la condición [1] FALSE FALSE x[x > 5 & x == y] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # Muestra todos los elementos que cumplen la condición ## [1] 7 y[x > 5 & x == y] ## [1] 7 2.2 Ejemplo ‘&&’: set.seed(101) # Genera un nº al azar entre 1 y 10 a <- trunc(runif(1, 1, 10)) # Devuelve T si a es menor o igual de siete Y mayor o igual que 6 a <= 7 && a >= 6 ## [1] FALSE 3 if (a <= 7 && a >= 6) { # Usa la misma condición anterior pero con un if cat("Ha salido 6 ó 7\n") } else { cat("El número es mayor de 7 o menor de 6\n") } ## El número es mayor de 7 o menor de 6 2.3 Ejemplo ‘|’: set.seed(101) x <- trunc(runif(10, 1, 10)) y <- trunc(runif(10, 1, 10)) x; y ## [1] 4 1 7 6 3 3 6 4 6 5 ## [1] 8 7 7 9 5 6 8 3 4 1 # Muestra todos los elementos de y # que coinciden en la misma posición que las x iguales a 1 o a 2. y[ x == 1 | y == 2] ## [1] 7 2.4 Ejemplo ‘||’ r <- readline("Escribe 5 ó 6") ## Escribe 5 ó 6 if (r == 5 || r == 6) { cat("Has respondido de forma correcta\n") } else { cat("Tu respuesta NO ha sido correcta\n") } ## Tu respuesta NO ha sido correcta 4 3 3.1 Funciones relacionadas isTRUE() Devuelve TRUE si un vector de un elemento es TRUE o FALSE si tiene cualquier otro valor Ver ejemplo de all.equal() 3.2 all.equal() En ocasiones el operador == falla por lo que es preferible utilizar la función all.equal. Este error no es especifico de R y se produce también en otros lenguajes de programación como C y C++, tiene que ver con la forma en la que se representan los decimales en el sistema binario. # Esto debería dar TRUE y sin embargo da FALSE 1 + 0.14 == 1.14 ## [1] FALSE # La función all.equal funciona correctamente all.equal(1 + 0.14, 1.14) ## [1] TRUE # Si la diferencia supera cierto valor de tolerancia esta función devuelve un mensaje all.equal(pi, 3.14) ## [1] "Mean relative difference: 0.0005069574" Debido a que no devuelve FALSE para ser usada en un if debe utilizarse junto con la función isTRUE() num <- 3.14 if( isTRUE(all.equal(pi,num))) { cat("Los números son iguales") } else { cat("Los números son distintos") } ## Los números son distintos 3.3 any() Devuelve TRUE si hay algún valor TRUE en un vector set.seed(400) vec <- trunc(runif(10,1,10)) vec ## [1] 2 2 7 4 9 4 3 5 3 3 5 # ¿Algún elemento de vec es 5? any(vec == 5) ## [1] TRUE 3.4 all() Devuelve TRUE si todos los elementos de un vector son TRUE, devuelve FALSE en caso contrario set.seed(400) vec <- trunc(runif(10,1,10)) vec ## [1] 2 2 7 4 9 4 3 5 3 3 # ¿Todos los elementos de vec son mayores de 0? all(vec > 0) ## [1] TRUE 6 4 4.1 Estructuras de control if() Ejecuta una acción u otra según que la condición sea verdadera o falsa Forma 1: if(condición) { expresión si condición es TRUE } Forma 2: if(condición) { expresión si condición es TRUE } else { expresión si condición es FALSE } esuno <- function(x) { if( x == 1) { cat("x es 1") } } esuno(1) ## x es 1 esuno(0) # Al no haber 'else' no hay respuesta esuno <- function(x) { if( x == 1) { cat("x es 1") } else { cat("x no es 1") } } esuno(1) ## x es 1 esuno(0) ## x no es 1 4.2 for() Ejectua código el número especificado de veces. for( var in seq) { expresión } 7 Repite la expresión entre llaves. seq es un vector y var va tomando todos los valores de seq. Cuando los ha tomado todos el bucle for termina. # 10 números al azar entre 1 y 10 v <- runif(10,1,10) i <- 0 # Este vector servirá para contar los números # Imprime los 10 números uno por uno for(n in v) { i <- i + 1 # Se suma 1 cada vez que se repite el bucle cat(i,":",n,"\n") } ## ## ## ## ## ## ## ## ## ## 1 : 1.792812 2 : 6.247917 3 : 8.247781 4 : 6.567163 5 : 7.879164 6 : 5.145019 7 : 5.886495 8 : 9.213887 9 : 3.545177 10 : 6.402242 # Imprime números del 1 al 10. # Al contener sólo una instrucción se pueden omitir las llaves for(i in 1:10) print(i) ## ## ## ## ## ## ## ## ## ## [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] 4.3 1 2 3 4 5 6 7 8 9 10 while() Repite un bucle mientras una condición sea verdadera # Imprime números del 1 al 10 i <- 0 max <- 10 # El bucle se repite mientras i sea menor de 10 while(i < max) { i <- i + 1 # Aumenta en 1 i. Sin esta línea el bucle sería infinito print(i) } ## [1] 1 8 ## ## ## ## ## ## ## ## ## [1] [1] [1] [1] [1] [1] [1] [1] [1] 4.4 2 3 4 5 6 7 8 9 10 repeat Repite una secuencia de código hasta que se interrumpe con break # Imprime números del 1 al 10 i <- 0 repeat { i <- i + 1 if (i > 10) break print(i) } ## ## ## ## ## ## ## ## ## ## [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] 4.5 1 2 3 4 5 6 7 8 9 10 break Romple un bucle # Imprime en pantalla números aleatorios. Si encuentra un 5 se interrumpe set.seed(102) x <- trunc(runif(10,1,10)) x ## [1] 6 5 8 5 1 4 9 3 9 4 for(n in x) { if(n == 5) { cat("Se ha encontrado un 5. Interrumpiendo programa") break } print(n) } 9 ## [1] 6 ## Se ha encontrado un 5. Interrumpiendo programa 4.6 next Fuerza el salto de un bucle al siguiente punto # Imprime en pantalla números aleatorios. Si encuentra un 5 se lo salta set.seed(102) x <- trunc(runif(10,1,10)) x ## [1] 6 5 8 5 1 4 9 3 9 4 for(n in x) { if(n == 5) { cat("Se ha encontrado un 5. Pasando al siguiente\n") next } print(n) } ## ## ## ## ## ## ## ## ## ## [1] 6 Se ha encontrado un 5. Pasando al siguiente [1] 8 Se ha encontrado un 5. Pasando al siguiente [1] 1 [1] 4 [1] 9 [1] 3 [1] 9 [1] 4 4.7 ifelse() ifelse(condición, valor si TRUE, valor si FALSE) Se utiliza para evaluar vectores y devolver valores según se cumpla o no una condición. # Este programa convierte una serie de números aleatorios # (positivos y negativos) en una secuencia de -1 y 1, según sean # negativos o positivos, respectivamente set.seed(100) x <- rnorm(10) x ## ## [1] -0.50219235 0.13153117 -0.07891709 0.88678481 0.11697127 [6] 0.31863009 -0.58179068 0.71453271 -0.82525943 -0.35986213 10 y <- ifelse(x > 0, 1, -1) y ## 4.8 [1] -1 1 -1 1 1 1 -1 1 -1 -1 switch() switch(expresión, lista) Permite seleccionar entre una lista de posibles resultados a devolver. Es equivalente a utilizar una secuencias de if-else seguidos. # Devuelve diferentes valores según el texto de una variable seleccion <- function(respuesta) { s <- switch(respuesta, Sí = pi, No = exp(1), Quizás = 0, "Especifica Sí/No/Quizás") return(s) } seleccion("Sí") ## [1] 3.141593 seleccion("No") ## [1] 2.718282 seleccion("Quizás") ## [1] 0 seleccion("otra cosa") ## [1] "Especifica Sí/No/Quizás" El valor que no tiene nombre en la lista es el valor por defecto. Cuando la variable que se evalua (en el ejemplo anterior ‘respuesta’) es una cadena el nombre del elemento de la lista debe coincidir exactamente. Eso quiere decir que no podremos tener expresiones con espacios o que empiecen por números. Cuando la variable que se evalua es numérica, la respuesta seleccionada será aquella cuyo orden en la lista coincida con el número en cuestión. # Devuelve los valores cuyo orden coincide con la del número seleccion <- function(num) { s <- switch(num, "uno", "dos",) return(s) } seleccion(1) 11 ## [1] "uno" seleccion(2) ## [1] "dos" seleccion(0) ## NULL 12