Trilhas
/
R
R
/
Programa
/
Funções de vetores
Fu

Funções de vetores em R

1 exercício

Sobre Funções de vetores

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.

Vetor na entrada, escalar na saída

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.

Vetor na entrada, vetor na saída

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.

Vários vetores na entrada, vetor na saída

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

Vetor na entrada, matriz na saída

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).

Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Funções de vetores