Este é um conceito importante em R. Para ajudar a compreender o que é possível, pode ser útil pensar na dimensionalidade das entradas e das saídas das várias funções.
Já vimos funções que recebem um vetor e devolvem um único valor, do tipo escalar:
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
Muitas funções estatísticas também pertencem a esta categoria, como mean().
Para vetores lógicos, existem all() e any().
Muitas funções em R atuam sobre o vetor completo, produzindo muitas vezes uma saída também vetorial. É o caso da maioria das funções matemáticas:
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
Isto não é apenas conciso e prático: evita a necessidade de ciclos, de compreensões de listas ou de recursão, que são comuns noutras linguagens. Em R, as funções vetoriais são muitas vezes muito mais rápidas do que essas técnicas.
Para ordenar um vetor, existe sort(), que devolve os valores, e order(), que devolve 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
Por omissão, a ordenação é feita por ordem crescente.
Especifica decreasing = TRUE se for necessário, ou usa 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
Existem também funções que produzem saídas vetoriais cumulativas, percorrendo 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
Uma extensão deste conceito também pode ser usada para comparar vetores.
Por exemplo, considera a função pmax(), que devolve o máximo de cada comparação par a par:
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
És um observador de aves entusiasta que acompanha quantas aves visitaram o teu jardim nos últimos sete dias.
Tens seis tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.
Implementa a função today() para devolver quantas aves visitaram o teu jardim hoje. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último é a contagem de hoje.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
Implementa a função increment_todays_count() para incrementar a contagem de hoje:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
Implementa a função has_day_without_birds() que devolve TRUE se houve um dia em que zero aves visitaram o jardim; caso contrário, devolve FALSE:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
Implementa a função count_for_first_days() que devolve o número de aves que visitaram o teu jardim desde o início da semana, mas limita a contagem ao número de dias indicado a partir do início da semana.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
Há dias mais movimentados do que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram o teu jardim.
Implementa a função busy_days() para devolver o número de dias movimentados:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
Tens curiosidade em saber quantas aves, no total, já visitaram o jardim esta semana. Calcula os totais acumulados para cada dia.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
Suspeitas que as visitas das aves são afetadas pelos padrões de trânsito nas estradas próximas, sendo diferentes aos fins de semana e durante a semana.
Ordena as abreviaturas dos dias por ordem descendente do número de aves que visitaram o jardim.
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
Inscreve-te no Exercism para aprenderes e dominares R com 21 conceitos111 exercícios, e mentoria humana real, tudo grátis.