변수는 내부 블록에서만 접근할 수 있으므로 함수 내부에 정의한 이름은 함수 바깥에서 접근할 수 없다.
> rm(list = ls()) > f <- function() { + n <- 1 + } > f() > n Error : object 'n' not found
함수 내에서 이름은 함수 안의 변수들로부터 먼저 찾는다. 같은 이유로 함수 인자의 변수명 역시 전역 변수보다 우선한다.
> n <- 100 > f <- function(n) { + print(n) + } > f(1) [1] 1
중첩 함수에도 같은 규칙이 적용된다. 다음 코드에서 함수 g( ) 안에는 변수 a가 선언되어 있지 않다. 따라서 R 언어는 g( ) 함수를 감싼 함수 f( )로부터 변수 a를 찾는다.
> f <- function(x) { + a <- 2 + g <- function(y) { + print(y + a) + } + g(x) + } > f(1) [1] 3
그러나 만약 함수 f( )마저도 변수 a를 포함하고 있지 않다면 전역 변수 a를 사용하게 된다.
> a <- 100 > f <- function(x) { + g <- function(y) { + print(y + a) + } + g(x) + } > f(1) [1] 101
내부 블록에서 외부 블록에 선언된 값을 수정하고자 할 때는 주의가 필요하다. 내부 블록이 외부 블록보다 우선하므로 <-를 사용한 값의 할당 시, 값이 할당되는 대상이 내부 블록으로 간주되기 때문이다. 예를 들어, 함수 f( ) 안에 변수 a가 있고 중첩된 함수 g( )에서 함수 f( ) 안의 변수 a에 값을 할당하려고 하는 다음 코드를 살펴보자.
> f <- function() { + a <- 1 + g <- function() { + a <- 2 + print(a) + } + g() + print(a) + } > f() [1] 2 [1] 1
이 코드에서는 함수 g( )에서 함수 f( )에 선언된 변수 a에 2를 할당하려 했지만 <-는 함수 g( ) 내부에 새로운 변수 a를 만들고 해당 변수에 2를 할당한다. 따라서 f( )에서 print(a)가 수행될 때 출력은 2가 아니라 1이 된다. 만약 함수 g에서 함수 f( ) 안의 변수 또는 전역 변수에 값을 할당하려면 <<-를 사용해야 한다.
> b <- 0 > f <- function() { + a <- 1 + g <- function() { + a <<- 2 + b <<- 2 + print(a) + print(b) + } + g() + print(a) + print(b) + } > f() [1] 2 [1] 2 [1] 2 [1] 2
실행 결과 g( ) 안에서 <<-를 사용한 값의 할당은 함수 f( )에 선언된 a와 전역 변수인 b를 대상으로 이루어졌음을 볼 수 있다.