R 데이터 분석하다보면 연속적인 코드 작업을 수행하는 경우가 많습니다. 이 때, 코드를 간결하고 직관적으로 표현할 수 있는 방법이 바로 R 파이프 연산자(%>%
, |>
)입니다. 이 글에서는 R의 파이프 연산자의 기본적인 사용법과 그 장점에 대해 간단히 소개하겠습니다.
R 파이프 연산자
R에서는 많이 사용하는 연산자들 중 magrittr
패키지에서 제공하는 파이프 연산자 %>%
를 파이프 연산자로 부릅니다. 이 연산자는 2012년 처음 제안되어 지금까지도 계속 사랑받는 연산자입니다. 그리고, 10년이 지난 22년에, 같은 기능의 연산자를 R에서 패키지 로딩 없이 사용할 수 있는 파이프 연산자가 나왔습니다. 단적인 예지만, R 개발자들의 문호 개방 속도를 실감할 수 있습니다.
R 파이프 연산자 %>%
패키지 magrittr
10년 넘게 사용되어 온 %>%
연산자를 하루 아침에 버릴 수 없겠죠? 기존의 연산자와 새로나온 연산자의 사용법을 둘 다 알아봅시다.
library(tidyverse)
1:5 %>% sum()
>> [1] 15
위 코드의 뜻은 왼쪽에 있는 오브젝트를 오른쪽 함수의 “첫번째” 입력값으로 넣어줘 라는 의미입니다. 따라서 아래의 두 코드는 같은 의미가 됩니다.
subset(mtcars, disp <= 72)
>> mpg cyl disp hp drat wt qsec vs am gear carb
>> Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.9 1 1 4 1
mtcars %>% subset(disp <= 72)
>> mpg cyl disp hp drat wt qsec vs am gear carb
>> Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.9 1 1 4 1
R 파이프 연산자 단축키
파이프 연산자를 쉽게 입력하기 위해서는 Ctrl + Shift + M
을 입력하면 됩니다.
입력위치를 지정하는 점 (.
) 기호
파이프 연산자 오른쪽의 함수에 항상 첫 번째 자리에 넣고 싶은 경우만 존재하지 않습니다. 이런 경우 .
을 사용하여 원하는 곳에 넣을 수 있습니다.
mtcars %>% lm(mpg ~ disp, data = . )
>>
>> Call:
>> lm(formula = mpg ~ disp, data = .)
>>
>> Coefficients:
>> (Intercept) disp
>> 29.59985 -0.04122
위의 코드는 mtcars
데이터 프레임이 lm()
함수의 data 입력값 자리에 들어가는 효과가 발생합니다.
새로운 native R 파이프 연산자 |>
R 4.1 버전부터 다른 패키지를 불러올 필요 없이 기본 파이프 연산자가 업데이트 되었습니다. 그리고 파이프 연산자의 모든 기능을 사용하기 위해서는 R 4.3 버전 이상이 되어야 합니다.
- 기본 파이프 설정하는 방법
- RStudio의 옵션 메뉴
Use native pipe operator, |> (requires R 4.1 +)
를 활성화시키면Ctrl + Shift + M
단축키를 사용하여 입력 가능 - 입력 위치는
.
대신에_
를 사용
- RStudio의 옵션 메뉴
앞에서 살펴 본 %>%
의 코드를 native 파이프로 바꾸면 다음과 같습니다.
1:5 |> sum()
>> [1] 15
mtcars |> subset(disp <= 72)
>> mpg cyl disp hp drat wt qsec vs am gear carb
>> Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.9 1 1 4 1
입력위치를 지정하는 밑줄 (_
) 기호
mtcars |> lm(mpg ~ disp, data = _ ) # 입력위치 지정
>>
>> Call:
>> lm(formula = mpg ~ disp, data = mtcars)
>>
>> Coefficients:
>> (Intercept) disp
>> 29.59985 -0.04122
%>% 파이프 vs. |> 파이프 차이점
와
|>%>%
파이프는 기본적인 경우에는 동일하게 동작하지만 몇 가지 중요한 차이점이 있습니다. 여러분이 앞으로 기본 파이프 만을 사용할 것이라 하더라도, 회사에 가서 기존에 작성 된 여러분 선배들의 코드를 읽을 때, %>%
파이프를 알아야 하는 순간들이 오기 때문에 두 연산자의 차이점을 잘 알아두면 좋습니다.
인수 전달시 차이점
기본적으로 파이프는 왼쪽의 객체를 오른쪽 함수의 첫 번째 인수로 전달합니다. %>%
는 .
플레이스홀더를 사용하여 위치를 변경할 수 있습니다. 즉, 다음의 코드는 동일합니다.
x %>% f(1, .)
f(1, x)
R 4.2.0에서도 기본 파이프에 _
플레이스홀더가 추가 되었는데, 한 가지 제한이 있습니다. 인수는 반드시 명시되어야 한다는 점입니다. 다음 코드를 확인해주세요!
3 |> sample(1:10, _ )
>> Error in sample(1:10, "_") :
>> pipe placeholder can only be used as a named argument (<input>:1:6)
위의 코드는 전달 할 인수를 명시하지 않았기 때문에 에러가 납니다. 다음처럼 어디에 넣을지 정확하게 알려줘야 합니다.
3 |> sample(1:10, size = _ )
>> [1] 6 2 3
입력값 없는 함수로 전달하기
%>%
는 인수 없이 함수를 호출할 때 괄호를 생략 할 수 있지만, |>
는 항상 괄호가 필요합니다.
1:10 %>% sum
>> [1] 55
같은 코드도 기본 파이프에서는 에러가 납니다. 에러 없이 돌아가기 위해서는 sum 뒤에 괄호를 붙여서 함수라는 것을 명시 해줘야 합니다.
1:10 |> sum
>> Error in sum :
>> The pipe operator requires a function call as RHS (<input>:1:9)
1:10 |> sum()
>> [1] 55
플레이스홀더로 바로 시작
magrittr 파이프 (%>%
)를 사용하면 파이프를 시작할 때, cyl
>> [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4
>> [21] 4 8 8 8 8 4 4 4 8 6 8 4
mtcars |> _$cyl
>> [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4
>> [21] 4 8 8 8 8 4 4 4 8 6 8 4
본 포스팅은 R 프로그래밍 기초 공략.zip 교재의 일부분 입니다. 본 교재는 R을 독학하시는 분들을 위하여 특별히 제작된 교재입니다. R을 이제 막 시작하셨다면 슬기로운 통계생활과 같이 공부해보세요!