R 언어 정의: 스코프(Scope)

R 언어 정의: 스코프(Scope)

R의 스코프, 즉 스코프 규칙은 평가자가 기호(symbol)의 값을 찾기 위해 사용하는 규칙들의 집합이에요. 모든 컴퓨터 언어에는 이런 규칙이 있고, R의 규칙은 단순하지만 기본 규칙을 우회할 수 있는 메커니즘도 존재해요.

출처: 문서

본문

4.3.4 스코프 (Scope)

스코프, 즉 스코프 규칙(scoping rules)은 단순히 평가자(evaluator)가 기호(symbol)의 값을 찾기 위해 사용하는 규칙들의 집합이에요. 모든 컴퓨터 언어에는 이런 규칙들이 있어요. R의 규칙은 상당히 단순하지만, 일반적이거나 기본적인 규칙을 우회할 수 있는 메커니즘도 존재해요.

R은 *어휘적 스코프(lexical scope)*라고 불리는 규칙 체계를 따라요. 이는 표현식(expression)이 생성될 때 적용 중이던 변수 바인딩(variable bindings)이 그 표현식 안의 바인딩되지 않은 기호(unbound symbols)에 값을 제공하는 데 사용된다는 뜻이에요.

스코프의 흥미로운 성질 대부분은 함수를 평가할 때 나타나기 때문에, 여기서는 이 문제에 집중할게요. 기호는 바인딩되거나(bound) 바인딩되지 않은(unbound) 상태일 수 있어요. 함수의 모든 형식 인자(formal arguments)는 함수 본문에서 바인딩된 기호를 제공해요. 함수 본문의 다른 기호들은 지역 변수(local variables)이거나 바인딩되지 않은 변수예요. 지역 변수는 함수 내에서 정의된 변수예요. R에는 변수에 대한 공식적인 정의가 없어서 변수는 필요할 때 그냥 사용되기 때문에, 어떤 변수가 지역 변수인지 아닌지를 판단하기 어려울 수 있어요. 지역 변수는 먼저 정의되어야 하며, 일반적으로 할당(assignment)의 왼쪽에 놓이는 방식으로 정의돼요.

평가 과정에서 바인딩되지 않은 기호가 감지되면 R은 그 값을 찾으려고 시도해요. 이 과정이 어떻게 진행되는지를 결정하는 것이 스코프 규칙이에요. R에서는 함수의 환경(environment)이 먼저 검색되고, 그 다음에는 그 둘러싼 환경(enclosure), 이런 식으로 전역 환경(global environment)에 도달할 때까지 계속돼요. 전역 환경은 검색 목록(search list)의 맨 앞에 있고, 이 목록의 환경들이 순차적으로 검색되어 일치하는 기호를 찾아요. 그런 다음 첫 번째 일치 항목의 값이 사용돼요.

이 규칙 체계를 함수가 다른 함수로부터 값으로서 반환될 수 있다는 사실과 결합하면, 언뜻 보기엔 특이하지만 꽤 멋진 성질들을 얻을 수 있어요. 간단한 예를 보여드릴게요.

f <- function() {
    y <- 10
    g <- function(x) x + y
    return(g)
}
h <- f()
h(3)

여기서 흥미로운 질문은 h가 평가될 때 어떤 일이 일어나느냐는 거예요. 함수 본문이 평가될 때 지역 변수나 바인딩된 변수의 값을 결정하는 데는 문제가 없어요. 스코프 규칙은 언어가 바인딩되지 않은 변수의 값을 어떻게 찾을지를 결정해요.

h(3)을 평가하면 그 본문이 g의 본문임을 알 수 있어요. 그 본문 안에서 x는 형식 인자에 바인딩되고 y는 바인딩되지 않은 상태예요. 어휘적 스코프를 사용하는 언어에서는 x는 값 3과 연결되고, yf에 지역인 값 10과 연결돼요. 따라서 h(3)은 값 13을 반환해야 해요. R에서는 실제로 그렇게 동작해요. S의 경우에는 스코프 규칙이 다르기 때문에, 작업 공간(workspace)에 y라는 변수가 없다면 y를 찾을 수 없다는 오류가 발생하고, 만약 있다면 그 값을 사용하게 돼요.

더 알아보기 (Learn more)

출처: R Language Definition - 스코프(Scope)