A vetorização em R significa basicamente que qualquer loop é movido para uma linguagem compilada mais rápida, como C ou FORTRAN. Para que isso ocorra, o (s) vetor (es) em questão deve ser "atômico" - ou seja, "plano" e homogêneo - e o tipo de vetor, com o qual você pode verificar typeof()
, deve fazer sentido para a (s) operação (ões) realizada (s). Se é atômico, então é vetorizado.
Você pode verificar se um vetor é atômico usando is.atomic()
. Outro tipo de vetor que não é vetorizado é chamado de "recursivo", que você pode verificar usandois.recursive()
. Objetos recursivos podem conter outros objetos de qualquer tipo, ou seja, eles podem ser heterogêneos. Listas e quadros de dados são recursivos.
Tente algo como o seguinte para obter algumas idéias sobre atômica versus recursiva:
# 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
Eu acho que você pode assumir que muitas, se não a maioria, das funções R que você usa com mais freqüência são vetorizadas. Eu acho que não há outra maneira de verificar isso, exceto olhando a documentação ou as funções internas. Sempre que você pensar em escrever um loop for para executar operações simples em elementos, pense em como fazê-lo usando vetorização. Com prática suficiente, isso se tornará uma segunda natureza para você. Para mais detalhes, recomendo este post de Noam Ross.