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:
parent.env
là môi trường trong đó một bao đóng (ví dụ: hàm) được xác định. parent.frame
là 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.frame
có 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 đó env
là 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ể).