렉시컬 환경
렉시컬 환경 (Lexical environment)
이번에는 R의 렉시컬 환경이 어떻게 구성되고, 함수 안에서 변수가 어떤 순서로 탐색되는지 설명해 드릴게요. 환경과 프레임의 개념을 정확히 이해하면 R의 스코프 규칙이 훨씬 명확해져요.
출처: 문서
본문
3.5.2 Lexical environment
함수를 호출할 때마다 함수 안에서 생성된 지역 변수들을 담는 *프레임(frame)*이 만들어지고, 그 프레임은 어떤 환경(environment) 안에서 평가됩니다. 이 둘이 결합하여 새로운 환경을 만듭니다. 용어를 주의하세요. 프레임은 변수들의 집합이고, 환경은 프레임들의 중첩입니다(또는 동일하게 말하면, 가장 안쪽 프레임에 더해 그것을 둘러싼 환경입니다).
환경은 변수에 할당되거나 다른 객체 안에 포함될 수 있습니다. 하지만 환경은 표준 객체가 아니라는 점을 유의하세요. 특히 할당 시 복사되지 않습니다.
클로저(mode "function") 객체는 정의의 일부로 자신이 생성된 환경을 담고 있습니다(기본적으로 그렇습니다. 이 환경은 environment<-로 조작할 수 있습니다). 이후 그 함수가 호출되면, 평가 환경(evaluation environment)은 클로저의 환경을 둘러싼 환경(enclosure)으로 하여 생성됩니다. 이 평가 환경이 호출자의 환경과 반드시 같지는 않다는 점에 주의하세요!
따라서 함수 내부에서 어떤 변수를 요청하면, 먼저 평가 환경에서 찾고, 그다음 둘러싼 환경, 그 둘러싼 환경의 둘러싼 환경, 이런 식으로 찾아나갑니다. 전역 환경(global environment)이나 패키지의 환경에 도달하면, 검색은 검색 경로(search path)를 따라 기본 패키지의 환경까지 계속됩니다. 거기서도 변수를 찾지 못하면, 검색은 그다음 빈 환경(empty environment)으로 진행되고 결국 실패합니다.