시작하기무료로 시작하기

& 대신 && 사용하기

두 주사위 눈이 같은지 판단하기 위해 move_square() 함수는 if 문을 사용해요.

if (is_double[1] & is_double[2] & is_double[3]) {
    current <- 11 # Go To Jail - square 11 == Jail
}

& 연산자는 항상 양쪽 인수를 모두 평가해요. 즉, x & y라고 쓰면 R은 언제나 xy가 무엇인지 계산하려고 해요. 어떤 경우에는 이렇게 하는 것이 비효율적일 수 있어요. 예를 들어 xFALSE라면, y의 값과 상관없이 x & y는 항상 FALSE가 되죠. 따라서 그 계산을 생략하면 약간의 처리 시간을 절약할 수 있어요. && 연산자는 이 점을 활용해, 전체 결과에 영향을 주지 않는 경우에는 y를 굳이 계산하지 않아요.

이 코드에서는 is_double[1]FALSE라면 is_double[2]is_double[3]를 평가할 필요가 없으므로, &&&로 바꾸면 속도를 조금 높일 수 있어요.

유의할 점은 &&는 길이가 1인 논리값, 즉 단일 논리값(예: if 조건에 넘기는 값)에서만 동작한다는 것이고, &는 길이가 1보다 큰 논리 벡터에도 동작한다는 점이에요.

이 연습은 강의의 일부입니다

효율적인 R 코드 작성

강의 보기

연습 안내

  1. &&를 사용한다는 점만 제외하고 move()와 유사한 improved_move() 함수를 만드세요.
  2. microbenchmark()를 사용해 이전 버전인 move()improved_move()의 성능을 비교하세요.

실습형 인터랙티브 연습

이 예제를 이 샘플 코드를 완성하여 풀어보세요.

# Example data
is_double

# Define the previous solution
move <- function(is_double) {
    if (is_double[1] & is_double[2] & is_double[3]) {
        current <- 11 # Go To Jail
    }
}

# Define the improved solution
improved_move <- function(is_double) {
    if (is_double[1] ___ is_double[2] ___ is_double[3]) {
        current <- 11 # Go To Jail
    }
}

# microbenchmark both solutions
# Very occassionally the improved solution is actually a little slower
# This is just random chance
microbenchmark(___, ___, times = 1e5)
코드 편집 및 실행