환경(Environments)

환경(Environments)

R에서 환경이 어떻게 구성되고 동작하는지, 프레임과 인클로저의 개념부터 접근 방법까지 알아볼게요.

출처: 문서

본문

2.1.10 환경(Environments)

환경(environments)은 크게 두 가지로 구성된다고 볼 수 있어요. 하나는 심볼-값 쌍(symbol-value pairs)의 집합으로 이루어진 프레임(frame), 그리고 다른 하나는 둘러싼 환경을 가리키는 포인터인 *인클로저(enclosure)*예요.

R이 심볼의 값을 찾을 때는 먼저 프레임을 살펴봐요. 일치하는 심볼이 있으면 그 값을 반환하고, 없으면 둘러싼 환경에 접근해서 같은 과정을 반복해요. 환경들은 트리 구조를 이루는데, 여기서 인클로저가 부모 역할을 해요. 환경 트리는 부모가 없는 빈 환경(empty environment)에 뿌리를 두고 있으며, 이 빈 환경은 emptyenv()로 접근할 수 있어요. 그리고 이 빈 환경은 베이스 패키지(base package) 환경의 직접적인 부모예요. 베이스 패키지 환경은 baseenv() 함수로 접근할 수 있죠.

환경은 함수 호출에 의해 암시적으로 생성되기도 해요. 이 과정은 '함수 객체(Function objects)와 어휘 환경(Lexical environment)'에서 설명하고 있죠. 이때 환경에는 함수 지역 변수(인자를 포함)가 담기고, 그 인클로저는 현재 호출된 함수의 환경이 돼요. 물론 환경을 new.env로 직접 생성할 수도 있어요.

환경의 프레임 내용은 ls, names, $, [, [[, get, get0을 사용해 접근할 수 있고, $<-, [[<-, assign뿐만 아니라 evalevalq로 조작할 수 있어요. parent.env 함수를 이용하면 환경의 인클로저에 접근할 수 있습니다.

대부분의 다른 R 객체와 달리 환경은 함수에 전달하거나 할당에 사용할 때 복사되지 않아요. 그래서 같은 환경을 여러 심볼에 할당한 뒤 그중 하나를 변경하면 다른 심볼들도 함께 바뀌어요. 특히 환경에 속성(attribute)을 할당하면 예상치 못한 결과가 생길 수 있으니 주의해야 해요.

더 알아보기 (Learn more)

출처: R Language Definition - 환경(Environments)