R에서 parent.frame ()과 parent.env ()의 차이점은 무엇입니까? 참조에 의한 호출에서 어떻게 다릅니 까?


84

누군가가 간단한 예를 들어 이것을 설명 할 수 있다면 도움이 될까요?

또한 parent.frame()대신 사용하는 것이 유용 parent.env()하거나 그 반대의 경우도 마찬가지입니다.

답변:


99

parent.env클로저 (예 : 함수)가 정의 된 환경입니다. parent.frame클로저가 호출 된 환경입니다.

f = function() 
     c(f=environment(), defined_in=parent.env(environment()),  
       called_from=parent.frame())
g = function() 
     c(g=environment(), f())

그리고

> g()
$g
<environment: 0x14060e8>

$f
<environment: 0x1405f28>

$defined_in
<environment: R_GlobalEnv>

$called_from
<environment: 0x14060e8>

나는 단순한 필사자가 언제 정말로 그것을 사용하고 싶을 지 확신하지 못하지만, 개념은 여기서 어휘 범위를 이해하는 데 유용합니다.

> f = function() x
> g = function() { x = 2; f() }
> h = function() { x = 3; function() x }
> x = 1
> f()
[1] 1
> g()
[1] 1
> h()()
[1] 3

또는 R 소개의 수수께끼 같은 '은행 계좌'예에서. 세부 정보 섹션의 첫 번째 문단이 ?parent.frame상황을 명확히 할 수 있습니다.

환경은 R에서 널리 퍼져 있습니다. 예를 들어, search()경로는 (대략) 형제-> 부모 관계로 함께 연결된 환경입니다. 하나는 때때로보고 env = new.env(parent=emptyenv())보통 - 우회하기 심볼 룩업에 env[["x"]]처음에 보이는 것 env, 다음에서 env의 부모 발견되지 않는 경우는. 마찬가지로, <<-할당 외모는에서 시작 parent.env. R의 비교적 새로운 참조 클래스 구현은 이러한 아이디어에 의존하여 심볼 (인스턴스 필드 및 메서드)을 찾을 수있는 인스턴스 별 환경을 정의합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.