Operadores
## Objetivos de Aprendizaje
- Dominar operadores aritméticos
- Comprender operadores de comparación
- Aprender operadores lógicos
- Trabajar con vectorización
## Operadores Aritméticos
### Operaciones Básicas
```r
a <- 10
b <- 3
a + b # 13 (suma)
a - b # 7 (resta)
a * b # 30 (multiplicación)
a / b # 3.33... (división)
a ^ b # 1000 (potencia)
a %% b # 1 (módulo)
a %/% b # 3 (división entera)
```
### Comportamiento de la División
```r
# División estándar
10 / 3 # 3.333333
# División entera (piso)
10 %/% 3 # 3
# Módulo (resto)
10 %% 3 # 1
```
### Incremento/Decremento
```r
# R no tiene operador ++, usa esto en su lugar
x <- 5
x <- x + 1 # 6
x <- x - 1 # 5
# O usa asignación compuesta
x <- 5
x += 1 # 6
x -= 1 # 5
x *= 2 # 10
x /= 2 # 5
```
## Operadores de Comparación
### Operadores Relacionales
```r
a <- 5
b <- 10
a == b # FALSE (igual)
a != b # TRUE (no igual)
a < b # TRUE (menor que)
a > b # FALSE (mayor que)
a <= b # TRUE (menor o igual)
a >= b # FALSE (mayor o igual)
```
### Comparación con NA
```r
# Las comparaciones con NA necesitan manejo especial
x <- c(1, 2, NA, 4)
# Esto retorna NA para comparación con NA
x == NA
# Usa is.na() en su lugar
is.na(x) # FALSE FALSE TRUE FALSE
# Filtrar usando complete.cases
x[!is.na(x)] # 1 2 4
```
## Operadores Lógicos
### AND, OR, NOT
```r
a <- TRUE
b <- FALSE
!a # FALSE (NOT)
a & b # FALSE (AND - elemento a elemento)
a && b # FALSE (AND - solo primer elemento)
a | b # TRUE (OR - elemento a elemento)
a || b # TRUE (OR - solo primer elemento)
```
### Elemento a elemento vs Valor Único
```r
# Valores únicos usan && y ||
if (TRUE && FALSE) {
print("No imprimirá")
}
# Vectores usan & y |
c(TRUE, TRUE, FALSE) & c(TRUE, FALSE, FALSE)
# TRUE FALSE FALSE
```
### Evaluación de Cortocircuito
```r
# && y || cortocircuitan
x <- 0
# No evaluará y / x porque x != 0 es FALSE
if (x != 0 && y / x > 2) {
"sí"
}
# || cortocircuita en TRUE
if (FALSE || TRUE) {
"sí"
}
```
### Tabla de Verdad
| A | B | A & B | A \| B | !A |
|---|---|-------|--------|-----|
| TRUE | TRUE | TRUE | TRUE | FALSE |
| TRUE | FALSE | FALSE | TRUE | FALSE |
| FALSE | TRUE | FALSE | TRUE | TRUE |
| FALSE | FALSE | FALSE | FALSE | TRUE |
## Operadores de Asignación
### Asignación de Variables
```r
# Asignación estándar
x <- 10
# También funciona pero no es idiomático
x = 10
# Asignación global
x <<- 10
# Para funciones, se puede usar
assign("x", 10)
```
## Operadores Especiales
### Operador de Secuencia
```r
1:5 # c(1, 2, 3, 4, 5)
5:1 # c(5, 4, 3, 2, 1)
-3:3 # c(-3, -2, -1, 0, 1, 2, 3)
```
### Operador de Membresía
```r
# %in% verifica membresía
x <- 3
x %in% c(1, 2, 3, 4, 5) # TRUE
# Útil para filtrar
valores <- c("manzana", "plátano", "cereza")
"plátano" %in% valores # TRUE
valores %in% c("plátano", "naranja") # FALSE TRUE FALSE
```
### Operador de Concatenación de Cadenas
```r
# %% para concatenación de cadenas
nombre <- "Alicia"
paste("Hola", nombre) # "Hola Alicia"
# paste0 (sin separador)
paste0("Hola", nombre) # "HolaAlicia"
# estilo sprintf
sprintf("Hola %s, tienes %d mensajes", nombre, 5)
```
### Otros Operadores Especiales
```r
# %/% división entera
10 %/% 3 # 3
# %% módulo
10 %% 3 # 1
# %*% multiplicación de matrices
mat <- matrix(1:4, nrow = 2)
mat %*% mat # Producto de matrices
```
## Precedencia de Operadores
### De Mayor a Menor
| Prioridad | Operadores |
|-----------|-------------------|
| 1 | `::`, `:::` |
| 2 | `[`, `[[` |
| 3 | `$`, `@` |
| 4 | `^` (unario) |
| 5 | `:` (secuencia) |
| 6 | `::` |
| 7 | `-`, `+` (unario) |
| 8 | `::` |
| 9 | `%%`, `%/%`, `%*%` |
| 10 | `*`, `/` |
| 11 | `+`, `-` (binario) |
| 12 | `<`, `>`, `<=`, `>=`, `==`, `!=` |
| 13 | `!` |
| 14 | `&`, `&&` |
| 15 | `\|`, `\|\|` |
| 16 | `~` |
| 17 | `->`, `->>` |
| 18 | `<-`, `<<-` |
| 19 | `=` |
| 20 | `?` (ayuda) |
### Usar Paréntesis
```r
# Precedencia clara
(a + b) * c
# En lugar de confiar en la memoria
a + b * c # Multiplica primero
```
## Vectorización
### ¿Qué es la Vectorización?
R realiza operaciones elemento a elemento en vectores.
```r
# Suma elemento a elemento
c(1, 2, 3) + c(10, 20, 30) # c(11, 22, 33)
# Esto es más eficiente que bucles
vec <- 1:1000
vec2 <- vec * 2 # No se necesita bucle
```
### Funciones Vectorizadas
```r
# Muchas funciones son naturalmente vectorizadas
sqrt(c(1, 4, 9, 16)) # c(1, 2, 3, 4)
log(c(1, 10, 100)) # c(0, 2.3, 4.6)
```
### Reciclado
```r
# El vector más corto se recicla
c(1, 2) + c(10, 20, 30, 40)
# Warning: longer object length not multiple of shorter
# Pero con un solo valor
c(1, 2, 3) + 10 # c(11, 12, 13)
```
### Comparación con Bucles
```r
# Vectorizado (rápido)
result <- sum(1:1000000)
# Versión con bucle (lento en R)
total <- 0
for (i in 1:1000000) {
total <- total + i
}
```
### ifelse Vectorizado
```r
# ifelse para condicionales vectorizados
x <- 1:10
ifelse(x > 5, "grande", "pequeño")
# "pequeño" "pequeño" "pequeño" "pequeño" "pequeño" "grande" "grande" "grande" "grande" "grande"
# ifelse anidado
puntuacion <- 75
ifelse(puntuacion >= 90, "A",
ifelse(puntuacion >= 80, "B",
ifelse(puntuacion >= 70, "C", "F")))
# "C"
```
## Resumen
- Aritméticos: `+`, `-`, `*`, `/`, `^`, `%%`, `%/%`
- Comparación: `==`, `!=`, `<`, `>`, `<=`, `>=`
- Lógicos: `&`, `|`, `!`, `&&`, `||`
- Asignación: `<-`, `<<-`, `=`
- Especiales: `%in%`, `%%`, `%*%`, `%/%`, `:` (secuencia)
- Usa paréntesis para aclarar precedencia
- R es vectorizado - las operaciones se aplican elemento a elemento
- Usa `ifelse()` para condicionales vectorizados
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →