Experimentando o R 4.1.0

Primeiras impressões ao usar o nova versão do R

RStudio
R
Pipe
Author

Beatriz Milz

Published

May 18, 2021

Introdução

A versão do 4.1.0 do R foi lançada hoje (dia 18 de maio de 2021), e a comunidade está bem animada com a chegada do pipe |> no R base!

Esse post não tem como objetivo explicar quais foram as mudanças, e sim para apenas mostrar as primeiras impressões ao usar a versão 4.1.0! Caso você queira saber mais sobre as mudanças, recomendo esses textos:

Além disso, amanhã acontecerá uma live no canal do Youtube da Curso-R (e eu pretendo participar):

Atalho do pipe no RStudio

Além de atualizar a versão do R para 4.1.0 (veja mais aqui), eu também atualizei a versão do RStudio para a preview (veja mais aqui).

A versão preview apresenta a opção de atalho para o novo pipe, seguindo os passos: Tools > Global Options > Code > Use native pipe operator.

Ativando essa opção, é possível usar o mesmo atalho de costume para escrever o pipe do R base: Ctrl + Shift + M!

Exemplos!

Para experimentar, resolvi tentar adaptar os exemplos apresentados no capítulo sobre o operador pipe, do livro Ciência de Dados em R, da qual sou contribuidora!

Como vou apresentar o código original mostrado no livro (usando o pipe do {magrittr}) e a adaptação com pipe do R base, é necessário carregar o pipe do pacote {magrittr} para que os exemplos a seguir funcionem:

# Esse argumento include.only é útil nesse caso,
# pois apenas a função %>% é carregada
library(magrittr, include.only = "%>%")

O primeiro exemplo do livro mostra algumas equivalências, e adiciono então uma terceira linha, mostrando a equivalência com o pipe do R base: substituimos o %>% do {magrittr}, pelo |> do R base!

f(x, y) # sem o pipe
x %>% f(y) # com o pipe do magrittr
x |> f(y) # com o pipe do R base

Exemplo 1

No primeiro exemplo, apenas foi necessário substituir o pipe do magrittr %>% pelo pipe do R base |>:

Exemplo do livro:

Vamos calcular a raiz quadrada da soma dos valores de 1 a 4. Primeiro, sem o pipe.

x <- c(1, 2, 3, 4)

Clique abaixo nos diferentes “Panels” para verificar a diferença no código!

# Versão original do livro, sem usar o pipe
sqrt(sum(x))
[1] 3.162278
# Versão original do livro, com o pipe do magrittr
x %>% sum() %>% sqrt()
[1] 3.162278
# Versão usando o pipe do R base
x |> sum() |> sqrt()
[1] 3.162278

Foi tranquilo!

Exemplo 2

Neste próximo exemplo, não basta fazer a substituição feita no exemplo anterior. Isso acontece porque o pipe do magrittr aceita utilizar o ponto . (chamado de dot placeholder em inglês) para indicar onde o resultado recebido pelo pipe será substituído na próxima operação. Por outro lado, o pipe do R base não aceita essa forma.

Como o exemplo do livro utiliza o ponto ., isso teve que ser adaptado para que o código funcionasse! Essa adaptação ocorreu utilizando outra grande novidade do R 4.1.0: as funções anônimas: \(x). Meu objetivo não é explicar aqui, mas recomendo fortemente que leia texto do Caio Lente, pois lá tem uma seção inteira sobre esse tema. Sinceramente não foi de primeira que eu acertei o uso da função anônima no exemplo abaixo, mas depois de olhar alguns outros exemplos, deu certo!

Exemplo do livro:

Queremos que o dataset seja recebido pelo segundo argumento (data=) da função “lm”.

Clique abaixo nos diferentes “Panels” para verificar a diferença no código!

# Versão original do livro usando o pipe do magrittr
airquality %>%
  na.omit() %>%
  lm(Ozone ~ Wind + Temp + Solar.R, data = .) %>%
  summary()

Call:
lm(formula = Ozone ~ Wind + Temp + Solar.R, data = .)

Residuals:
    Min      1Q  Median      3Q     Max 
-40.485 -14.219  -3.551  10.097  95.619 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -64.34208   23.05472  -2.791  0.00623 ** 
Wind         -3.33359    0.65441  -5.094 1.52e-06 ***
Temp          1.65209    0.25353   6.516 2.42e-09 ***
Solar.R       0.05982    0.02319   2.580  0.01124 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 21.18 on 107 degrees of freedom
Multiple R-squared:  0.6059,    Adjusted R-squared:  0.5948 
F-statistic: 54.83 on 3 and 107 DF,  p-value: < 2.2e-16

Versão adaptada com pipe do R base 4.1.

# Versão usando o pipe do R base + funções anônimas
airquality |>
  na.omit()  |>
  {\(x) lm(formula = Ozone ~ Wind + Temp + Solar.R, data = x)}() |>
  summary()

Call:
lm(formula = Ozone ~ Wind + Temp + Solar.R, data = x)

Residuals:
    Min      1Q  Median      3Q     Max 
-40.485 -14.219  -3.551  10.097  95.619 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -64.34208   23.05472  -2.791  0.00623 ** 
Wind         -3.33359    0.65441  -5.094 1.52e-06 ***
Temp          1.65209    0.25353   6.516 2.42e-09 ***
Solar.R       0.05982    0.02319   2.580  0.01124 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 21.18 on 107 degrees of freedom
Multiple R-squared:  0.6059,    Adjusted R-squared:  0.5948 
F-statistic: 54.83 on 3 and 107 DF,  p-value: < 2.2e-16

Versão adaptada com pipe do R base 4.2:

# Versão usando o pipe do R base + funções anônimas
airquality |>
  na.omit() |>
  lm(Ozone ~ Wind + Temp + Solar.R, data = _) |>
  summary()

Call:
lm(formula = Ozone ~ Wind + Temp + Solar.R, data = na.omit(airquality))

Residuals:
    Min      1Q  Median      3Q     Max 
-40.485 -14.219  -3.551  10.097  95.619 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -64.34208   23.05472  -2.791  0.00623 ** 
Wind         -3.33359    0.65441  -5.094 1.52e-06 ***
Temp          1.65209    0.25353   6.516 2.42e-09 ***
Solar.R       0.05982    0.02319   2.580  0.01124 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 21.18 on 107 degrees of freedom
Multiple R-squared:  0.6059,    Adjusted R-squared:  0.5948 
F-statistic: 54.83 on 3 and 107 DF,  p-value: < 2.2e-16

Conclusão

É muito legal ver que a linguagem está desenvolvendo e incorporando contribuições que surgiram das demandas da comunidade! Muito empolgante testar coisas novas. Caso você também esteja animada(o), assista a live da Curso-R sobre o tema!

Lembrando que os códigos acima utilizando o pipe do R base e as notações das funções anônimas apenas funcionarão se você instalou a nova versão do R: 4.1.0!

Essas são as informações relacionadas à plataforma que estou usando, e a versão do R:

sessioninfo::session_info()$platform
 setting  value
 version  R version 4.2.0 (2022-04-22)
 os       macOS Big Sur 11.6.6
 system   aarch64, darwin20
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/Sao_Paulo
 date     2022-06-16
 pandoc   2.17.1.1 @ /Applications/RStudio.app/Contents/MacOS/quarto/bin/ (via rmarkdown)