La vectorización en R básicamente significa que cualquier bucle se mueve a un lenguaje compilado más rápido como C o FORTRAN. Para que eso ocurra, los vectores en cuestión deben ser "atómicos", es decir, deben ser "planos" y homogéneos, y el tipo de vector, con el que puede verificar typeof()
, debe tener sentido para las operaciones que se realizan. Si es atómico, entonces está vectorizado.
Puede verificar si un vector es atómico usando is.atomic()
. Otro tipo de vector que no está vectorizado se llama "recursivo", que puede verificar usando is.recursive()
. Los objetos recursivos pueden contener otros objetos de cualquier tipo, es decir, pueden ser heterogéneos. Las listas y los marcos de datos son recursivos.
Pruebe algo como lo siguiente para obtener una idea de lo atómico frente a lo recursivo:
# Atomic:
1
1:3
c("a", "b", "c")
c(T, F, T)
# Recursive:
list(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))
data.frame(nums = 1:3, letts = c("a", "b", "c"), logics = c(T, F, T))
# Vectors can be atomic or recursive:
is.vector(1:9) # TRUE
is.atomic(1:9) # TRUE
is.recursive(1:9) # FALSE
is.vector(list(nums = 1:9, chars = "x")) # TRUE
is.atomic(list(1:9)) # FALSE
is.recursive(list(1:9)) # TRUE
# Matrices are atomic, data frames are recursive:
is.vector(matrix(1:9, 3)) # FALSE
is.atomic(matrix(1:9, 3)) # TRUE
is.recursive(matrix(1:9, 3)) # FALSE
is.vector(as.data.frame(matrix(1:9, 3))) # FALSE
is.atomic(as.data.frame(matrix(1:9, 3))) # FALSE
is.recursive(as.data.frame(matrix(1:9, 3))) # TRUE
Creo que puede suponer que muchas, si no la mayoría, de las funciones R que utiliza con mayor frecuencia están vectorizadas. No creo que haya otra forma de verificar esto que no sea mirando la documentación o las funciones internas. Siempre que piense en escribir un bucle for para realizar operaciones simples basadas en elementos, piense en cómo hacerlo usando la vectorización. Con suficiente práctica se convertirá en una segunda naturaleza para ti. Para más detalles, puedo recomendar esta publicación de blog de Noam Ross.
En principio, debería ser evidente en la página de ayuda,
help(function)
o?function
debería dar la respuesta.fuente