R 데이터 분석하다보면 연속적인 코드 작업을 수행하는 경우가 많습니다. 이 때, 코드를 간결하고 직관적으로 표현할 수 있는 방법이 바로 R 파이프 연산자(%>% , |>)입니다. 이 글에서는 R의 파이프 연산자의 기본적인 사용법과 그 장점에 대해 간단히 소개하겠습니다.

R 파이프 연산자

R에서는 많이 사용하는 연산자들 중 magrittr 패키지에서 제공하는 파이프 연산자 %>% 를 파이프 연산자로 부릅니다. 이 연산자는 2012년 처음 제안되어 지금까지도 계속 사랑받는 연산자입니다. 그리고, 10년이 지난 22년에, 같은 기능의 연산자를 R에서 패키지 로딩 없이 사용할 수 있는 파이프 연산자가 나왔습니다. 단적인 예지만, R 개발자들의 문호 개방 속도를 실감할 수 있습니다.

R 파이프 연산자 %>% 패키지 magrittr

R 파이프 연산자 패키지 magrittr의 유래가 된 작품
R 파이프 연산자 패키지 이름의 유래가 된 René Magritte의 작품; “Ceci n’est pas une pipe

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 단축키를 사용하여 입력 가능
    • 입력 위치는 . 대신에 _ 를 사용

앞에서 살펴 본 %>%의 코드를 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 파이프 (%>%)를 사용하면 파이프를 시작할 때, $, [[, [와 같은 연산자의 왼쪽에 .를 사용할 수 있으므로, 데이터 프레임에서 단일 열을 추출할 수 있습니다. 기본 파이프에서는 이 기능을 지원하지 않았었습니다만, 이번 R 4.3.0 이상 버전에서부터는 기본 파이프도 이 기능도 지원하게 되었습니다.

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
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을 이제 막 시작하셨다면 슬기로운 통계생활과 같이 공부해보세요!

Similar Posts