R 언어 정의: 평가에 대한 추가 설명

R 언어 정의: 평가에 대한 추가 설명

R의 eval 함수를 더 깊이 살펴볼게요. 평가 환경을 지정하는 방법과 리스트·데이터 프레임에서의 평가까지, 실제로 자주 쓰이는 동작들을 함께 알아봐요.

출처: 문서

본문

6.3 평가에 대한 추가 설명

eval 함수는 이 장 앞부분에서 call 객체를 평가하는 수단으로 소개했어요. 하지만 그게 전부는 아니에요. 평가가 일어날 **환경(environment)**을 지정하는 것도 가능하거든요. 기본값은 eval이 호출된 평가 프레임이지만, 다른 값으로 설정해야 하는 경우가 꽤 많아요.

아주 자주, 관련된 평가 프레임은 현재 프레임의 부모 프레임이에요 (참조: ???). 특히 평가할 객체가 함수 인자에 대한 substitute 연산의 결과라면, 그 객체는 호출자에게만 의미가 있는 변수들을 담고 있어요. 호출자의 변수가 피호출자의 렉시컬 스코프에 있을 거라고 기대할 이유는 없잖아요. 부모 프레임에서의 평가는 자주 일어나기 때문에, eval.parent 함수가 eval(expr, sys.frame(sys.parent()))의 줄임말로 제공돼요.

또 자주 일어나는 경우는 list나 data frame 안에서의 평가예요. 가령 model.frame 함수에 data 인자가 주어지면 이런 일이 발생해요. 일반적으로 모델 수식의 항(term)들은 data 안에서 평가되어야 하지만, 때로는 model.frame 호출자에 있는 항목들을 참조할 수도 있어요. 이것은 시뮬레이션 연구와 관련해서 유용할 때가 있어요. 따라서 이런 목적을 위해서는 list 안에서 표현식을 평가할 뿐만 아니라, 변수가 list에 없을 때 검색을 계속할 상위 환경(엔클로저)을 지정해야 해요. 그래서 호출은 다음과 같은 형태를 가져요.

eval(expr, data, sys.frame(sys.parent()))

주어진 환경에서의 평가는 실제로 그 환경을 변경할 수 있다는 점에 유의하세요. 가장 확실한 예는 할당 연산자와 관련된 경우예요. 예를 들어,

eval(quote(total <- 0), environment(robert$balance)) # rob Rob

이것은 list 안에서 평가할 때도 마찬가지예요. 다만 원래 list는 바뀌지 않아요. 실제로는 복사본에 대해 작업하고 있기 때문이에요.

더 알아보기 (Learn more)

출처: R Language Definition - 6.3 평가에 대한 추가 설명