[R] R Style Guide by Hadley Wickham - 2. Syntax (1)

해당 포스트는 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


2. 문법(Syntax)

2.1 객체 이름(Object names)

"컴퓨터 과학에는 캐시 무효화와 이름 지정이라는 두 가지 어려움이 있습니다."

  • 필 칼튼

변수와 함수 이름에는 소문자, 숫자, 밑줄(_, underscores) 만 사용해야 하며, 이름에 단어 구분이 필요할 경우엔 밑줄(_, underscores)를 사용하시면 됩니다.

# Good
day_one
day_1

# Bad
DayOne
dayone

기본 R은 함수 이름(contrib.url())과 클래스 이름(data.frame)에 점(., dot)을 사용하지만, 점(.)은 S3 객체 시스템 전용으로만 사용하는 것이 좋습니다. S3 메소드들은 function.class로 이름이 주어지며, 만약 함수와 클래스 이름에 점(., dot)을 사용한다면 as.data.frame.data.frame()와 같은 혼란스러운 이름이 생성될 수 있습니다.

변수 이름(ex: model_2018, model_2019, model_2020)에 데이터를 입력하려고 한다면, 목록(list)나 데이터 프레임(data.frame)을 대신 사용하는 것이 좋습니다.

일반적으로는 변수 이름은 명사로 만들고 함수이름은 동사로 만듭니다. 쉽지 않겠지만 항상 간결하고 의미있는 이름을 만들기 위해 노력해야 합니다.

# Good
day_one

# Bad
first_day_of_the_month
djm1

공통 함수 및 변수 이름을 재사용(re-using)하는 경우, 코드를 읽는 사람들에게 혼란을 줄 수 있기에 가급적 피하는 것이 좋습니다.

2.2 띄어쓰기(Spacing)

2.2.1 쉼표(Commas)

일반 언어 사용할 때와 같이, 항상 쉼표(,, comma) 뒤에는 공백을 넣는 것이 좋습니다.

# Good
x[, 1]

# Bad
x[,1]
x[ ,1]
x[ , 1]

2.2.2 괄호(Parentheses)

정기적인 함수 호출을 위해 괄호 안이나 바깥쪽에 공백을 넣지 않는 것이 좋습니다.

# Good
mean(x, na.rm = TRUE)

# Bad
mean (x, na.rm = TRUE)
mean( x, na.rm = TRUE )

if, for, while 문을 사용할 때에는 괄호(( ))의 앞뒤로 공백을 두는 것이 좋습니다.

# Good
if (debug) {
  show(x)
}

# Bad
if(debug){
  show(x)
}

함수 인수(arguments)에 사용되는 괄호(( )) 뒤에는 공백을 두는 것이 좋습니다.

# Good
function(x) {}

# Bad
function (x) {}
function(x){}

2.2.3 수용(Embracing)

수용 연산자({{ }})는 자신의 특별한 동작을 강조할 수 있도록 항상 내부 공간이 있어야 합니다.

# Good
max_by <- function(data, var, by) {
  data %>%
    group_by({{ by }}) %>%
    summarise(maximum = max({{ var }}, na.rm = TRUE))
}

# Bad
max_by <- function(data, var, by) {
  data %>%
    group_by({{by}}) %>%
    summarise(maximum = max({{var}}, na.rm = TRUE))
}

2.2.4 인픽스 연산자(Infix operators)

대부분의 인픽스 연산자들(==, +, -, <- 등)은 항상 앞뒤에 공간을 두는 것이 좋습니다.

# Good
height <- (feet * 12) + inches
mean(x, na.rm = TRUE)

# Bad
height<-feet*12+inches
mean(x, na.rm=TRUE)

인픽스 연산자들 중에는

절대 공간(space)로 둘러쌓이면 안되는 몇가지 예외

가 있습니다.

  • 우선 순위가 높은 연산자들(high precedence) : ::, :::, $, @, [, [[, ^, 단항 -, 단항 +, :
# Good
sqrt(x^2 + y^2)
df$z
x <- 1:10

# Bad
sqrt(x ^ 2 + y ^ 2)
df $ z
x <- 1 : 10
  • 우항(right-hand side)이 단일 식별자일 때 단측 공식(Single-sided formulas)
# Good
~foo
tribble(
  ~col1, ~col2,
  "a",   "b"
)

# Bad
~ foo
tribble(
  ~ col1, ~ col2,
  "a", "b"
)

우항(right-hand side)이 복잡한 단측 공식(Single-sided formulas)에는 공백이 필요하지 않습니다.

# Good
~ .x + .y

# Bad
~.x + .y
  • !!!!!를 사용하여 tidy 평가에 사용했을 때(단일 -/+와 동등한 우선순위를 가지기 때문에)
# Good
call(!!xyz)

# Bad
call(!! xyz)
call( !! xyz)
call(! !xyz)

좀 더 자세한 내용은 Hadley Wickham의 Advanced R 에서 확인하실 수 있습니다.

  • 도움말(help) 연산자
# Good
package?stats
?mean

# Bad
package ? stats
? mean

2.2.5 Extra spaces

= 또는 <- 의 정렬이 향상되는 여분의 공백을 추가해도 됩니다.

# Good
list(
  total = a + b + c,
  mean  = (a + b + c) / n
) 

# Also fine
list(
  total = a + b + c,
  mean = (a + b + c) / n
)

일반적으로 공간(space)이 허용되지 않는 위치에는 공간(space)를 추가하지 않는 것이 좋습니다.

출처

[1] The tidyverse style guide
[2] Syntax: Operator Syntax and Precedence
[3] Advanced R by Hadley Wickham

the-tidyverse-style-guide-by-Hadley-Wickham.pdf
165.9 kB

▲ The tidyverse style gudie 원문 다운받기