Operadores lógicos y de comparación

Anuncio
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
Descargar