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.
Em princípio, deve ser aparente na página de ajuda
help(function)
ou?function
fornecer a resposta.fonte