더북(TheBook)

05 | 스코프

코드에 기술한 이름(예를 들면, 변수명)이 어디에서 사용 가능한지를 정하는 규칙을 스코프Scope라고 한다. R에서는 대부분의 현대적인 프로그래밍 언어가 그러하듯이 문법적 스코프lexical scope(정적 스코프static scope)를 사용하며, 문법적 스코프는 변수가 정의된 블록 내부에서만 변수를 접근할 수 있는 규칙을 말한다.

R의 스코프 규칙을 코드를 통해 알아보자. 예를 들어, 콘솔에서 변수를 선언하면 모든 곳에서 사용 가능한 전역 변수가 된다. 이 변수는 현재 실행 중인 R 세션 동안 유효하다. 따라서 코드를 여러 파일에 나눠놓고 source( )를 사용해 실행할 경우 다른 파일에서도 해당 변수를 사용할 수 있다.2

다음은 콘솔에서 변수 n을 선언한 다음, 이 변수를 함수 내부에서 사용한 예다.

> n <- 1
> f <- function() {
+    print(n)
+ }
> f()
[1] 1
> n <- 2
> f()
[1] 2

만약 함수 내부에서 전역 변수와 같은 이름의 지역 변수를 사용하면, 함수 내부의 지역 변수가 우선한다.

> n <- 100
> f <- function() {
+    n <- 1
+    print(n)
+ }
> f()
[1] 1

만약 함수 내부에서도, 전역 변수로도 선언되지 않은 이름을 사용하면 에러다. 이를 살펴보기에 앞서 R 객체를 메모리에서 삭제하거나 객체를 나열하는 함수들에 대해 살펴보자.

표 3-6 메모리상의 객체 관련 함수

rm : 지정한 환경3에서 객체를 삭제한다.

rm(
  ...,                       # 삭제할 객체의 목록
  list=character(),          # 삭제할 객체를 나열한 벡터
  envir=as.environment(pos)  # 객체를 삭제할 환경
)

ls : 객체를 나열한다.

ls(
  name, # 객체를 나열할 환경의 이름
  envir # name 대신 직접 환경을 지정할 경우 사용
)

반환 값은 객체 이름의 문자열 벡터다.

따라서 rm(list=ls( ))는 메모리에 있는 모든 객체를 삭제하는 명령이 된다. 다음은 rm(list=ls( ))를 사용해 메모리에 존재하는 객체들을 삭제하여 앞서 예제에서 선언한 n을 없앤 다음, 함수 f( )에서 n을 출력해본 예다.

> rm(list = ls())
> f <- function() {
+ print(n)
+ }
> f()
Error in print(x) : object 'n' not found

2 ‘1.6 배치 실행’ 절에서 source( )에 대해 설명했다.

3 환경(environment)은 명명된 객체(named object)를 나열한 프레임(frame), 해당 환경을 감싸고 있는 또 다른 환경(enclosing environment)으로 구성된다. 환경을 사용하면 호출된 함수(callee)가 호출한 쪽(caller)의 변수를 조작하는 등의 작업을 할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.