Coerción
La coerción es una característica de los lenguajes de programación que permite, implícita o explícitamente, convertir un elemento de un tipo de datos en otro, sin tener en cuenta la comprobación de tipos.
Coerción Implícita
Cuando llamamos a una función con un argumento de un tipo erróneo, R intentará convertir los elementos de un tipo de datos en otro, sin tener en cuenta la comprobación de tipos. Por ejemplo, supongamos que definimos un vector v como en el ejemplo:
v <- c(1, 2, 3, 4, 5)
v
## [1] 1 2 3 4 5
typeof(v)
## [1] "double"
class(v)
## [1] "numeric"
Si cambiamos el segundo elemento del vector con la palabra "coercion". R cambiará la clase del objeto a character y todos los elementos del vector a char como podemos ver en el siguiente ejemplo:
v[2] <- "coercion"
typeof(v)
## [1] "character"
class(v)
## [1] "character"
Cuando un vector lógico es convertido a un integer o double, TRUE es cambiado a
1 y FALSE a 0:
v <- c(FALSE, TRUE, FALSE)
as.numeric(v)
## [1] 0 1 0

A continuación se muestra un resumen de las reglas para la coerción:
- Los valores lógicos son transformados a números:
TRUEserá cambiado a 1 yFALSEa O. - Los valores son convertidos al tipo más simple.
- El orden es: logical < integer < numeric < complex < character < list.
- Los objetos de tipo
rawno son convertidos a otros tipos. - Los atributos de los objetos son borrados cuando un objeto es cambiado de un tipo a otro.
Coerción Explícita
Los objetos pueden ser convertidos en otro tipo de foma explícita mediante el uso
de la función as.()*
Ejemplos
v <- c(1, 2, 3, 4, 5)
class(v)
## [1] "numeric"
as.logical(v)
## [1] TRUE TRUE TRUE TRUE TRUE
as.character(v)
## [1] "1" "2" "3" "4" "5"
En ocasiones, la conversión no puede ser llevada a cabo, en este caso R devuelve NA.
v <- c("a", "b", "c")
as.numeric(v)
## Warning: NAs introduced by coercion
## [1] NA NA NA
as.logical(v)
## [1] NA NA NA
En resumen, la mayoría de las funciones producen un error cuando el tipo de datos que esperan no coincide con los que pasamos como argumentos. En esta situación tenemos dos posibilidades:
- Comprobar el tipo de datos utilizando las funciones
is.*(), que nos responden con un valor lógico. - Forzar el tipo de datos deseados coercionando, para lo cual podemos utilizar funciones del tipo
as.*(), que fuerzan el tipo de datos.
A continuación se muestra una lista con los tipos más importantes que se pueden comprobar o forzar:
| Tipo | Comprobación | Coerción |
|---|---|---|
| array | `is.array()` | `as.array()` |
| character | `is.character()` | `as.character()` |
| complex | `is.complex()` | `as.complex()` |
| double | `is.double()` | `as.double()` |
| factor | `is.factor()` | `as.factor()` |
| integer | `is.integer()` | `as.integer()` |
| list | `is.list()` | `as.list()` |
| logical | `is.logical()` | `as.logical()` |
| matrix | `is.matrix()` | `as.matrix()` |
| NA | `is.na()` | `as.na()` |
| NaN | `is.nan()` | `as.nan()` |
| NULL | ` is.null()` | `as.null()` |
| numeric | `is.numeric()` | `as.numeric()` |
| vector | `is.vector()` | `as.vector()` |
Tabla 1: Comprobación y coerción de los tipos más importantes
Podemos ver una lista completa de todas las funciones is.() en el paquete base mediante:
ls(pattern = "^is", baseenv())
Asimismo, para obtener las funciones as.*() podemos hacerlo mediante la siguiente instrucción:
ls(pattern = "^as", baseenv())