Este é um conceito amplo em R. Para ajudar a entender as possibilidades, pode ser útil considerar a dimensionalidade da(s) entrada(s) e da saída das várias funções.
Já vimos funções que recebem um vetor e retornam um único valor do tipo escalar:
v <- 1:5
length(v)
#> [1] 5
sum(v)
#> [1] 15
Muitas funções estatísticas também estão nessa categoria, como mean().
Para vetores lógicos, existem all() e any(), que retornam um único TRUE ou FALSE.
Muitas funções em R operam sobre vetores inteiros, muitas vezes produzindo uma saída vetorial. Isso inclui a maioria das funções matemáticas:
sq <- c(4, 9, 16, 25)
sqrt(sq) # square root
#> [1] 2 3 4 5
Isso não é apenas conciso e conveniente, evitando a necessidade de laços, compreensões de lista ou recursão, que são comuns em outras linguagens. Em R, as funções vetoriais costumam rodar muito mais rápido do que essas técnicas.
Você já usou funções vetorizadas muito mais do que provavelmente percebeu. Compare estas:
v <- c(2, 7, 9)
w <- c(3, 1, 5)
v + w
#> [1] 5 8 14
"+"(v, w)
#> [1] 5 8 14
Os operadores infixos familiares são apenas açúcar sintático para a função vetorizada subjacente! Neste caso, "+"().
Para ordenar um vetor, existe sort() para retornar os valores e order() para retornar os índices:
v <- c("I", "am", "not", "in", "order")
sort(v)
#> [1] "am" "I" "in" "not" "order"
order(v)
#> [1] 2 1 4 3 5
O padrão é ordenar em ordem crescente.
Especifique decreasing = TRUE se necessário, ou use rev() para inverter um vetor existente.
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
Também existem funções como cumsum() e cumprod() que produzem saídas vetoriais cumulativas, operando sobre o vetor de entrada da esquerda para a direita:
cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
Os exemplos acima são semelhantes às operações foldl em muitas linguagens funcionais, exceto que a saída é um vetor com todos os valores intermediários.
Uma extensão desse conceito também pode ser usada para comparar vetores.
Por exemplo, considere a função de máximo par a par pmax():
v
#> [1] 2 7 9
w
#> [1] 3 1 5
pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
Essa função e outras semelhantes também aceitam um número arbitrário de vetores de entrada, não apenas dois.
O exemplo acima usa vetores de comprimento igual. Como discutido no conceito de Filtragem de Vetores, R usa reciclagem para estender vetores que de alguma forma são "curtos demais". Repetindo: use isso com cuidado e, de preferência, apenas com um vetor de comprimento 1.
pmax(v, 5)
#> [1] 5 7 9
Isso é menos comum, mas é relativamente fácil escrever funções que aparentemente recebem escalares na entrada e retornam vetores na saída.
Quando aplicadas a uma entrada vetorial, a saída é uma matrix bidimensional (abordada em um conceito posterior).