[R] R Style Guide by Hadley Wickham - 4. Pipes

해당 포스트는 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-by-Hadley-Wickham.pdf
165.9 kB

▲ The tidyverse style guide 원문 다운받기