해당 포스트는 Hadley Wickham이 작성한 'The tidyverse style guide' 를 번역하여 정리한 글입니다.
Lists
Intro - 0. Welcome
Analysis - 1. Files
Analysis - 2. Syntax (1)
Analysis - 2. Syntax (2)
Analysis - 3. Functions
Analysis - 4. Pipes
Analysis - 5. ggplot2
Packages - 6. Files
Packages - 7. Documentation
Packages - 8. Tests
Packages - 9. Error messages
Packages - 10. News
Packages - 11. Git/GitHub
4. 파이프(Pipes)
4.1 소개(Introduction)
파이프(%>%
)는 작업을 수행하는 대상(객체)보다
작업의 순서(일련의 행동)를 강조
할 때 사용하는 것이 올바르며, 아래의 경우에는 사용을 피하는게 좋습니다.
- 한 번에 한 개 이상의 개체(Object)를 조작해야 하는 경우
- 의미있는 이름을 부여할 수 있는 중간 개체(Object)가 있는 경우
4.2 공백(Whitespace)
파이프(%>%
)는 항상 앞에 공백(Whitespace)이 있어야 하며 보통 새로운 줄이 와야합니다. 또한, 첫 번째 단계 이후 각 행은 들여쓰기를 적용해야 합니다.
이 구조는 새로운 단계를 더 쉽게 추가(또는 기존 단계 재배열)하고 중간 단계를 간과하지 않도록 합니다.
# Good
iris %>%
group_by(Species) %>%
summarize_if(is.numeric, mean) %>%
ungroup() %>%
gather(measure, value, -Species) %>%
arrange(value)
# Bad
iris %>% group_by(Species) %>% summarize_all(mean) %>%
ungroup %>% gather(measure, value, -Species) %>%
arrange(value)
4.3 긴 줄(Long lines)
만약 함수에 대한 인수(argument)를 한 줄에 쓰기 어렵다면, 각 인수들(arguments)을 자신의 줄에 맞춰 들여쓰기(indent)하여 사용하시면 됩니다.
iris %>%
group_by(Species) %>%
summarise(
Sepal.Length = mean(Sepal.Length),
Sepal.Width = mean(Sepal.Width),
Species = n_distinct(Species)
)}
4.4 짧은 파이프(Short Pipes)
1단계 파이프는 한 줄로 유지될 수 있으나 향후 확장 계획이 없는 경우라면 일반 함수 호출로 재작성하는 것이 좋습니다.
# Good
iris %>% arrange(Species)
iris %>%
arrange(Species)
arrange(iris, Species)
짧은 파이프를 긴 파이프의 함수 인수로 사용하는 것이 유용한 경우가 가끔 있습니다. 짧은 인라인 파이프(다른 곳에서 조회할 필요없음)로 코드를 더 잘 읽을 수 있는지 또는 코드를 파이프 밖으로 이동하여 호출 이름을 지정하는 것이 더 좋은지에 대해 신중하게 고려하는 것이 좋습니다.
# Good
x %>%
select(a, b, w) %>%
left_join(y %>% select(a, b, v), by = c("a", "b"))
# Better
x_join <- x %>% select(a, b, w)
y_join <- y %>% select(a, b, v)
left_join(x_join, y_join, by = c("a", "b"))
4.5 인수가 없는 경우(No arguments)
magrittr
는 인수를 생략(( )
)하고 함수를 사용할 수 있도록 기능을 제공하고 있으나 사용을 추천하지 않습니다.
# Good
x %>%
unique() %>%
sort()
# Bad
x %>%
unique %>%
sort
4.6 할당(Assignment)
허용되는 할당(Assignment)에는 아래 3가지 형태가 있습니다.
- 별도의 행에 변수 이름 및 할당
iris_long <-
iris %>%
gather(measure, value, -Species) %>%
arrange(-value)
- 같은 줄에 변수 이름과 할당
iris_long <- iris %>%
gather(measure, value, -Species) %>%
arrange(-value)
- 파이프 끝에서
->
를 사용하여 할당
->
를 사용한 할당이 가장 자연스럽다고 생각하지만, 코드 읽기를 어렵게 한다. 이름이 먼저 오면 파이프의 목적을 상기시키는 표제 역할을 할 수 있다. - Hadley Wickham
iris %>%
gather(measure, value, -Species) %>%
arrange(-value) ->
iris_long
magrittr
패키지의 %<>%
연산자는 '%>%
기능 + 할당(assignment)'을 모두 처리해주는 연산자 입니다. 그러나 코드 읽기를 어렵게 하기에 사용하는 것은 추천하지 않습니다.
# Good
x <- x %>%
abs() %>%
sort()
# Bad
x %<>%
abs() %>%
sort()
출처
[1] The tidyverse style guide
[2] [R] %>% 파이프 연산자와 magrittr
▲ The tidyverse style guide 원문 다운받기