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:
TRUE
será cambiado a 1 yFALSE
a O. - Los valores son convertidos al tipo más simple.
- El orden es: logical < integer < numeric < complex < character < list.
- Los objetos de tipo
raw
no 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())