CẬP NHẬT R-lang xác định một environment
khi có một khung . Tôi có xu hướng nghĩ về các khung như các khung ngăn xếp, không phải là ánh xạ từ tên đến giá trị - nhưng sau đó tất nhiên là data.frame
ánh xạ các tên cột thành các vectơ (và sau đó một số ...). Tôi nghĩ hầu hết sự nhầm lẫn xuất phát từ thực tế là ngôn ngữ S ban đầu (và vẫn là S-Plus) không có các đối tượng môi trường, vì vậy tất cả các "khung" về cơ bản là những đối tượng môi trường nào, ngoại trừ chúng chỉ tồn tại như một phần của ngăn xếp cuộc gọi.
Ví dụ: trong S-Plus tài liệu cho sys.nframe
nói "sys.nframe trả về chỉ số bằng số của khung hiện tại trong danh sách tất cả các khung". ... nghe có vẻ khủng khiếp như khung xếp chồng với tôi ... Bạn có thể đọc thêm về khung xếp chồng tại đây: http://en.wikipedia.org/wiki/Call_stack#Structure
Tôi mở rộng một số giải thích bên dưới và sử dụng thuật ngữ "khung ngăn xếp" một cách nhất quán (tôi hy vọng).
END CẬP NHẬT
tôi muốn giải thích cho họ như thế này:
Một môi trường là một đối tượng mà các bản đồ tên biến để giá trị. Mỗi ánh xạ được gọi là một ràng buộc. Giá trị có thể là giá trị thực hoặc lời hứa. Một môi trường có môi trường cha mẹ (ngoại trừ môi trường trống). Khi bạn tra cứu một biểu tượng trong một môi trường và nó không được tìm thấy, các môi trường mẹ cũng được tìm kiếm.
Lời hứa là biểu thức không được đánh giá và môi trường để đánh giá biểu thức. Khi lời hứa được đánh giá, nó được thay thế bằng giá trị được tạo ra.
Một đóng cửa là một chức năng và môi trường mà hàm được định nghĩa trong một chức năng như lm
sẽ có môi trường số liệu thống kê không gian tên và chức năng người dùng định nghĩa sẽ có môi trường toàn cầu -. Nhưng một hàm f
được xác định trong phạm vi chức năng khác g
sẽ có môi trường địa phương cho g
làm môi trường của nó.
Khung ngăn xếp (hoặc bản ghi kích hoạt) là thứ đại diện cho các mục nhập trên ngăn xếp cuộc gọi. Mỗi khung ngăn xếp có môi trường cục bộ mà hàm được thực thi và biểu thức của hàm gọi (để sys.call
hoạt động).
Khi cuộc gọi hàm được thực thi, môi trường cục bộ được tạo với bộ cha mẹ được đặt thành môi trường đóng, đối số được đối sánh với đối số chính thức của hàm và các ràng buộc đó được thêm vào môi trường cục bộ (như lời hứa). Các đối số chính thức chưa từng có được gán giá trị mặc định (lời hứa) của hàm (nếu có) và được đánh dấu là bị thiếu. Một khung ngăn xếp sau đó được tạo ra với môi trường cục bộ này và biểu thức cuộc gọi. Khung ngăn xếp được đẩy lên ngăn xếp cuộc gọi và sau đó phần thân của hàm được đánh giá trong môi trường cục bộ này.
... vì vậy tất cả các ký hiệu trong cơ thể sẽ được tra cứu trong môi trường cục bộ (môi trường chính thức và biến cục bộ) và nếu không tìm thấy trong môi trường mẹ (môi trường đóng cửa) và của bố mẹ môi trường mẹ và vân vân cho đến khi tìm thấy.
Lưu ý rằng môi trường của khung ngăn xếp chính là NOT được tìm kiếm trong trường hợp này. Các parent.frame
, sys.frame
chức năng được các môi trường trên các cuộc gọi stack - có nghĩa là, môi trường của người gọi và môi trường của người gọi của người gọi vv ...
# Here match.fun needs to look in the caller's caller's environment to find what "x" is...
f <- function(FUN) match.fun(FUN)(1:10)
g <- function() { x=sin; y="x"; f(y) }
g() # same as sin(1:10)
# Here we see that the stack frames must also contain the actual call expression
f <- function(...) sys.call()
g <- function(...) f(..., x=42)
g(a=2) # f(..., x = 42)
@DirkEddelbuettel: Đó không phải là sự khiêm tốn; ngựa là lộn xộn. Tôi chưa đọc. Tôi sẽ lấy một bản sao và trả lời câu hỏi của riêng tôi. –
Câu trả lời của tôi có gần với những gì bạn đang tìm kiếm hay tôi nên làm rõ bất kỳ phần nào của nó? – Tommy