Menu

R'de Pipe Operatörü: %>% ve Yerleşik |>

%>% ne demektir, temel R'nin yerleşik |> operatörü nasıl çalışır, her birinin kuralları ve yer tutucuları ve yeni kodda hangisini kullanmalı.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Pipe'ların Çözdüğü Sorun

Bir pipe, kendinden önceki değeri alır ve sonraki fonksiyon çağrısına besler - x |> f(), f(x) demektir. Üç dört adım zincirleyene kadar bu önemsiz bir yeniden yazım gibi gelir. Pipe olmadan çok adımlı dönüşümler iç içe geçer ve iç içe çağrılar tersten okunur: gerçekleşen ilk şey en içteki konumda oturur.

round(sqrt(x), 1) ifadesini okumak için ortadan (x) başlar, dışa doğru ilerler (sqrt, sonra round) ve hangi sondaki , 1) parçasının hangi çağrıya ait olduğunu takip edersiniz. Üç düzey derinlikte bu can sıkıcıdır; her biri birden çok argümanlı veri çerçevesi fiilleriyle beş düzey derinlikte ise takip etmesi gerçekten zordur. İnsanların uzandığı alternatif - her ara adımı tmp1, tmp2, tmp3 içine kaydetmek - çalışma alanını kimsenin ihtiyaç duymadığı isimlerle doldurur.

Bir pipe, zinciri adımların gerçekten gerçekleştiği sırada yeniden yazar: x değerini al, sonra karekökünü al, sonra yuvarla.

Yerleşik Pipe |>

R 4.1'den beri pipe dilin kendisine gömülüdür - paket gerekmez. |>, önceki değeri sonraki çağrının ilk argümanı olarak yerleştirir:

c(1, 4, 9, 16) |> sqrt() |> round(1), tam olarak round(sqrt(c(1, 4, 9, 16)), 1) demektir - R ayrıştırma sırasında birini diğerine harfiyen yeniden yazar, dolayısıyla sıfır çalışma zamanı maliyeti vardır. Ama artık kod yukarıdan aşağıya bir tarif gibi okunur: veri, sonra sırayla her dönüşüm. Bu, yalnızca veri araçlarıyla değil herhangi bir fonksiyonla çalışır - mtcars |> head(3) baştan sona düz temel R'dir.

Pipe'ların, ilk parametresi "veri" olan fonksiyonlara ne kadar iyi uyduğuna dikkat edin: head, sort, unique, summary ve her dplyr fiili böyle tasarlanmıştır; işlem hatlarının R'de bu kadar doğal hissettirmesinin nedeni budur.

|> Kuralları

Yerleşik pipe bilinçli olarak katıdır. Üç kural neredeyse her şeyi kapsar:

1. Sonraki adım parantezli bir çağrı olmalıdır. x |> sqrt bir söz dizimi hatasıdır; x |> sqrt() yazmalısınız:

c(1, 4, 9) |> sqrt     # Error: The pipe operator requires a function call as RHS
c(1, 4, 9) |> sqrt()   # correct

2. Değer ilk argüman konumuna düşer. Yazdığınız fazladan argümanlar ondan sonra yerinde kalır - x |> round(1), round(x, 1) demektir.

3. Başka bir yere düşmesi için isimli bir argümanla _ yer tutucusunu kullanın (R 4.2+). Klasik durum: lm önce bir formül, sonra veriyi alır; dolayısıyla ona bir veri çerçevesi aktarmak data = _ gerektirir:

_ yalnızca bir kez ve yalnızca isimli bir argüman olarak görünebilir. Bu çok kısıtlayıcı olduğunda isimsiz bir fonksiyona aktarın - o, değeri istediği yere koyabilir:

Lambda parantez içine sarılır ve sonra () ile çağrılır - bu, 1. kuralı sağlar. Bunu tek bir işlem hattında sık yaptığınızı fark ederseniz, o adım muhtemelen isimli bir fonksiyon olmak istiyordur.

magrittr Pipe'ı %>%

Dilin bir pipe'ı olmadan önce magrittr paketi bir tane sağlıyordu ve %>%, tidyverse kodunun imzası hâline geldi - dplyr yüklemek onu size otomatik olarak verir. Son on yılda yazılmış hemen her dplyr eğitiminde ve betiğinde onu göreceksiniz:

library(dplyr)

mtcars %>%
  filter(mpg > 30) %>%
  select(mpg, wt)

%>% bir paketten geldiği için bu örnekler çıplak bir R oturumunda çalıştırılamaz - library(dplyr) (ya da library(magrittr)) yazmayı unutursanız alacağınız şey tam olarak Error: could not find function "%>%" mesajıdır.

Yaygın durumdaki davranışı |> ile aynıdır: önceki değeri sonraki çağrının ilk argümanına besler. Ama magrittr daha müsamahakârdır:

c(1, 4, 9) %>% sqrt                 # bare function name - no parentheses needed

mtcars %>% lm(mpg ~ wt, data = .)   # . placeholder, usable anywhere

c(-2, 3) %>% { max(abs(.)) }        # . can even appear several times, in nested calls

|> ve %>%: Önemli Farklar

İlk argümanlı bir işlem hattı için - ki gerçek kodun ezici çoğunluğu budur - ikisi birbirinin yerine geçer. Farklar uçlarda yaşar:

  • Kullanılabilirlik: |> temel R 4.1+'tır; %>% magrittr ister (genellikle dplyr üzerinden).
  • Parantez: |> sqrt() ister; %>% yalın sqrt kabul eder.
  • Yer tutucu: |> _ kullanır, bir kez ve yalnızca isimli argüman olarak (4.2+); %>% . kullanır, her yerde, istediğiniz kadar kez, iç içe çağrıların içinde bile.
  • Hız: |> ayrıştırma sırasında iç içe çağrıya yeniden yazılır - sıfır maliyet. %>% ise küçük (pratikte ihmal edilebilir) bir ek yükü olan sıradan bir fonksiyon çağrısıdır.

Buradaki hiçbir şey %>% operatörünü yanlış kılmaz - savaşta sınanmıştır ve biraz daha esnektir. Ama |> ötesinde yaptığı her şey bir lambda ile yapılabilir ve temel pipe hiçbir bağımlılık istemez.

Hangisini Kullanmalısınız?

Yeni kod için: |> kullanın. Dilin bir parçasıdır, R 4.1+ çalışan her yerde çalışır, paket gerektirmez ve katılığı bir özellik gibi okunur - işlem hatları basit kalır ya da isimli fonksiyonlara yeniden düzenlenir.

Ama %>% operatörünü akıcı biçimde okuyabilmelisiniz, çünkü tidyverse kod tabanları, Stack Overflow yanıtları ve 2014'ten beri yazılmış çoğu R kitabı onunla doludur. Var olan bir dplyr stiline sahip ekipler tutarlılık için sık sık %>% kullanmayı sürdürür ve bu makul bir karardır - en kötü seçim, iki operatörü tek bir dosyada karıştırmaktır. Hangisini yazarsanız yazın bir gelenek taşınır: uzun işlem hatlarında her adımı kendi satırına koyun ve pipe'ı satırın sonuna yerleştirin ki tarif bir adım listesi gibi okunsun.

Burada da apply ailesindeki zevk geçerlidir: pipe'lar doğrusal, adım adım dönüşümler içindir. Bir hesap dallandığında ya da ara sonuçlara iki kez ihtiyaç duyduğunda, her şeyi tek bir zincire zorlamak yerine iyi isimlendirilmiş bir değişkene atayın.

Buradan Ne Çıkarıyorsunuz

  • Bir pipe, önceki değeri sonraki çağrıya besler: x |> f() |> g(), gerçekleşme sırasında yazılmış g(f(x)) demektir.
  • |> temel R'dir (4.1+): parantez ister, ilk argümanı hedefler, isimli bir argümanla _ yer tutucusu (4.2+).
  • %>% magrittr/tidyverse'tür: yalın isimlere izin verir, . yer tutucusu her yerde - ama bir paket ister.
  • Yeni kodda |> tercih edin; başka her yerde %>% operatörünü gözünüzü kırpmadan okuyun.
  • Pipe'lar doğrusal tariflere yakışır; dallanan mantık isimli değişkenleri hak eder.

Sırada: paketler - %>%, dplyr ve R'nin diğer 20.000 uzantısının gerçekte nereden geldiği.

Sıkça Sorulan Sorular

R'de %>% ne demektir?

%>% magrittr pipe'ıdır: kendinden önceki değeri alır ve sonraki çağrının ilk argümanı olarak besler; yani x %>% f() %>% g(), g(f(x)) demektir. magrittr paketinden gelir ve dplyr ile tidyverse yüklenirken otomatik olarak gelir - temel R'nin parçası değildir.

R'de |> kullanmak için pakete ihtiyacım var mı?

Hayır. |>, 4.1 sürümünden beri temel R'ye gömülü yerleşik pipe'tır - hiçbir şey kurulmamış sade bir R oturumunda çalışır. Pakete ihtiyaç duyan %>% operatörüdür (magrittr ya da dplyr gibi onu yeniden dışa aktaran her şey).

R'de |> ile %>% arasındaki fark nedir?

İkisi de önceki değeri sonraki çağrıya besler. |> temel R'dir, açık parantez gerektirir (x |> sqrt()) ve _ yer tutucusunu yalnızca isimli bir argümanla kullanır. %>% magrittr ister, yalın fonksiyon adlarını kabul eder (x %>% sqrt) ve . yer tutucusu her yerde, istediğiniz kadar kez kullanılabilir. Yaygın ilk-argüman durumunda davranışları aynıdır.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA