Sự khác biệt giữa parent.frame () và parent.env () trong R; chúng khác nhau như thế nào trong cách gọi bằng cách tham chiếu?


84

Sẽ rất hữu ích nếu ai đó có thể minh họa điều này bằng một ví dụ đơn giản?

Ngoài ra, nó sẽ hữu ích ở đâu để sử dụng parent.frame()thay vì parent.env()và ngược lại.

Câu trả lời:


99

parent.envlà môi trường trong đó một bao đóng (ví dụ: hàm) được xác định. parent.framelà môi trường mà từ đó việc đóng đã được gọi.

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

và sau đó

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

$f
<environment: 0x1405f28>

$defined_in
<environment: R_GlobalEnv>

$called_from
<environment: 0x14060e8>

Tôi không chắc khi nào một người bình thường thực sự muốn sử dụng chúng, nhưng các khái niệm này rất hữu ích trong việc hiểu phạm vi từ vựng ở đây

> 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

hoặc trong ví dụ bí ẩn về 'tài khoản ngân hàng' trong phần Giới thiệu về R. Đoạn đầu tiên của phần Chi tiết ?parent.framecó thể làm rõ mọi thứ.

Các môi trường phổ biến trong R, ví dụ: search()đường dẫn là (gần đúng) các môi trường được xâu chuỗi với nhau trong mối quan hệ anh chị em -> cha mẹ. Đôi khi người ta nhìn thấy env = new.env(parent=emptyenv())để phá vỡ việc tra cứu ký hiệu - thông thường env[["x"]]sẽ tìm kiếm đầu tiên trong env, sau đó envlà phụ huynh nếu không tìm thấy. Tương tự như vậy, <<-tìm kiếm nhiệm vụ bắt đầu trong parent.env. Việc triển khai lớp tham chiếu tương đối mới trong R dựa trên những ý tưởng này để xác định một môi trường dành riêng cho cá thể, trong đó có thể tìm thấy các ký hiệu (trường và phương thức cá thể).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.