Lançada em Maio, a versão 4.1 do R trouxe algumas novidades para os usuários, como uma nova sintaxe de função anônima e uma nova engine gráfica. Entretanto, a mudança mais substancial foi a inclusão de um operador pipe nativo, o "|>". Para quem, como eu, está acostumado a utilizar o operador "%>%" do pacote magritt/tidyverse, a forma de utilização é bastante semelhante. Lembrando que operador pipe tem a função de permitir o encadeamento de uma função após a outra sem precisar criar variáveis intermediárias ou utilizar parênteses intermináveis.
A utilidade principal do pipe é melhorar a leitura do código. Por exemplo, todos as maneiras abaixo retornam o mesmo resultado.
#Variáveis intermediárias mtcars_filt = filter(mtcars, drat > 3) mtcars_group = group_by(mtcars_filt, gear) mtcars_final = summarise(mtcars_group, hp = mean(hp)) #Utilizando parênteses mtcars_final = summarise(group_by(filter(mtcars, drat > 3), gear), hp = mean(hp)) #Pipe mtcars_final = mtcars %>% filter(drat > 3) %>% group_by(gear) %>% summarise(hp = mean(hp))
Para utilizar o novo pipe, a sintaxe é exatamente a mesma, nesse caso.
#Novo pipe mtcars_final = mtcars |> filter(drat > 3) |> group_by(gear) |> summarise(hp = mean(hp)) <pre>
A vantagem mais óbvia desse novo pipe é que a utilização não requer o uso de pacotes adicionais. Entretanto, se a primeira coisa que você faz quando abre um novo script do R é digitar "library(tidyverse)", isso pode não fazer muita diferença. Além disso, ele é levemente mais eficiente, entretanto é uma diferença muito pequena para ser notada pelo usuário médio.
Agora, para quem pensa em atualizar o R e começar a utilizar o novo pipe, saiba que há dois principais problemas. O primeiro é que em alguns casos o novo pipe demanda uma sintaxe um pouco diferente. O pipe do magritt tem um elemento (".") que nós podemos colocar em casos em que o primeiro elemento da função não é lado esquerdo da expressão. Um desses casos é se estamos interessados em estimar uma regressão por pipe.
reg = mtcars %>% lm(hp ~ gear, data = .)
O novo operador pipe não tem esse elemento. Para chegar ao mesmo resultado, precisamos fazer uma alteração, utilizando uma função anônima. Aliás, essa também é uma novidade do R 4.1, que criou o \ (x), que nada mais é do que uma abreviação do "function(x)". O mesmo código acima fica bem menos legível.
reg = mtcars |> (\ (x) lm(hp ~ gear, data = x))()
A outra dificuldade é a utilização deste pipe só é possível para usuários do R 4.1, evidentemente. Códigos escritos com esse operador não funcionarão em versões antigas do R, o que pode ser um entrave para quem trabalha com compartilhamento de código.
Assim, a adoção do novo pipe pela comunidade ainda deve demorar um tempo (isso, se de fato ela ocorrer). Portanto, a recomendação, por enquanto, é aguardar um pouco mais para substituir os pipe do magritt pelo novo pipe.