Programação funcional em R

Aproveitando funções de aplicação e operações vetorizadas

Aprenda a aproveitar o paradigma de programação funcional do R para escrever código eficiente e conciso. Este tutorial aborda as principais funções de aplicação, operações vetorizadas e práticas recomendadas para programação funcional em R.

Programação
Autor
Afiliação
Data de Publicação

10 de fevereiro de 2024

Data de Modificação

29 de abril de 2025

Palavras-chave

Programação funcional R, vetorização em R, Funções apply no R, Família apply em R, Operações vetorizadas em R

Introdução

A programação funcional no R é um paradigma poderoso que se concentra no processamento eficiente de dados por meio de funções. Ao aproveitar as funções apply integradas do R e as operações vetorizadas, você pode escrever um código mais conciso, legível e rápido, muitas vezes eliminando a necessidade de loops explícitos. Este tutorial apresentará as principais funções (lapply() e sapply()) da família apply, demonstrará operações vetorizadas e fornecerá exemplos adicionais usando apply(), tapply(), mapply() e vapply(). Essas técnicas ajudarão você a escrever um código R elegante e eficiente.



A família Apply

O R oferece várias funções que ajudam você a aplicar operações em coleções de dados sem recorrer a loops. Essas funções incluem:

  • apply(): aplica uma função às margens de uma matriz.
  • lapply(): Retorna uma lista aplicando uma função sobre uma lista ou vetor.
  • sapply(): uma versão fácil de usar do lapply() que simplifica a saída.
  • vapply(): Semelhante a sapply(), mas requer a especificação do tipo de saída.
  • tapply(): aplica uma função sobre subconjuntos de um vetor, categorizados por um fator.
  • mapply(): versão multivariada de lapply(), aplicando uma função em paralelo sobre um conjunto de argumentos.

Exemplo: Usando lapply() e sapply()

# Criar uma lista de vetores numéricos
num_list <- list(a = 1:5, b = 6:10, c = 11:15)

# Usando `lapply` para calcular a média de cada vetor (retorna uma lista)
means_list <- lapply(num_list, mean)
print(means_list)
$a
[1] 3

$b
[1] 8

$c
[1] 13
# Usando `sapply` para calcular a média (simplifica para um vetor)
means_vector <- sapply(num_list, mean)
print(means_vector)
 a  b  c 
 3  8 13 

Operações vetorizadas

As operações vetorizadas no R permitem realizar operações elementares em vetores ou matrizes inteiros sem loops explícitos. Essa abordagem é geralmente mais rápida e concisa.

Exemplo: aritmética vetorizada

# Crie um vetor numérico
x <- 1:10

# Multiplique cada elemento por 2 usando multiplicação vetorizada
y <- x * 2
print(y)
 [1]  2  4  6  8 10 12 14 16 18 20
# Calcule a raiz quadrada de cada elemento
sqrt_values <- sqrt(x)
print(sqrt_values)
 [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427
 [9] 3.000000 3.162278

Exemplos adicionais da família Apply

Para aproveitar ao máximo o poder da família apply do R, considere estas funções adicionais:

Exemplo usando apply()

A função apply() é normalmente usada com matrizes ou matrizes para aplicar uma função sobre linhas ou colunas.

# Criar uma matriz 3x3
matrix_data <- matrix(1:9, nrow = 3, ncol = 3)
print(matrix_data)
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
# Soma de cada linha (`margin = 1`)
row_sums <- apply(matrix_data, 1, sum)
print(row_sums)
[1] 12 15 18
# Some cada coluna (`margin = 2`)
col_sums <- apply(matrix_data, 2, sum)
print(col_sums)
[1]  6 15 24

Exemplo usando tapply()

A função tapply() aplica uma função a subconjuntos de um vetor, definidos por um fator, o que é útil para operações agrupadas.

#|label: tapply-example
# Vetor de amostra de idades e um fator de agrupamento
ages <- c(23, 35, 27, 45, 31, 29)
groups <- factor(c("A", "B", "A", "B", "A", "B"))

# Calcule a idade média de cada grupo
mean_ages <- tapply(ages, groups, mean)
print(mean_ages)

Resultados:

       A        B 
27.00000 36.33333 

Exemplo usando mapply()

A função mapply() é uma versão multivariada de sapply(), aplicando uma função em paralelo sobre um conjunto de argumentos.

#|label: mapply-example
# Definir dois vetores numéricos
v1 <- 1:5
v2 <- 6:10

# Use mapply para somar os elementos correspondentes de ambos os vetores
sums <- mapply(sum, v1, v2)
print(sums)

Resultados:

[1]  7  9 11 13 15

Exemplo usando vapply()

A função vapply() é semelhante à sapply(), mas exige que você especifique o tipo de saída para obter resultados mais previsíveis.

#|label: vapply-example
# Defina uma função para calcular a raiz quadrada de um número
sqrt_func <- function(x) sqrt(x)

# Aplique a função a um vetor usando vapply, especificando que a saída deve ser numérica (1)
sqrt_values <- vapply(1:5, sqrt_func, FUN.VALUE = numeric(1))
print(sqrt_values)

Vantagens da programação funcional em R

  • Concisão:
    As construções funcionais permitem escrever menos linhas de código para operações comuns.

  • Legibilidade:
    O código que utiliza funções apply e operações vetorizadas costuma ser mais legível do que loops aninhados.

  • Desempenho:
    As operações vetorizadas são implementadas em código C otimizado, que pode ser significativamente mais rápido do que loops equivalentes em R.

  • Manutenção:
    Uma abordagem funcional pode levar a um código mais fácil de testar e manter, pois as funções encapsulam comportamentos específicos.

Práticas recomendadas

  • Mantenha as funções puras:
    Sempre que possível, crie funções que não tenham efeitos colaterais. Isso facilita o teste e o raciocínio sobre o seu código.

  • Use nomes descritivos:
    Nomeie claramente suas funções e variáveis para indicar sua finalidade.

  • Aproveite as funções integradas:
    Utilize o rico conjunto de funções apply e operações vetorizadas do R antes de recorrer a loops explícitos.

  • Perfilando seu código:
    Use ferramentas de perfilagem (por exemplo, Rprof()) para identificar gargalos e otimizar seções críticas para o desempenho.

Conclusão

A programação funcional no R permite escrever código mais conciso, eficiente e fácil de manter. Ao usar a família apply e operações vetorizadas, você pode realizar manipulações complexas de dados com facilidade. Experimente os exemplos fornecidos e integre essas técnicas ao seu fluxo de trabalho para aprimorar seus recursos de processamento de dados.

Leitura adicional

Boa programação e aproveite para escrever programas R eficientes usando técnicas de programação funcional!

Explore mais artigos

Nota

Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.

placeholder

placeholder
Nenhum item correspondente
De volta ao topo

Reuso

Citação

BibTeX
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Programação funcional em R},
  date = {2024-02-10},
  url = {https://www.datanovia.com/pt/learn/programming/r/advanced/functional-programming.html},
  langid = {pt}
}
Por favor, cite este trabalho como:
Kassambara, Alboukadel. 2024. “Programação funcional em R.” February 10, 2024. https://www.datanovia.com/pt/learn/programming/r/advanced/functional-programming.html.