2011-10-26 27 views
14

Tôi muốn hiểu rõ hơn cách environments, closuresframes có liên quan. Tôi hiểu chức năng đóng cửa có chứa một môi trường, môi trường chứa một khung và một bao vây, và khung chứa các biến, nhưng tôi là một chút mờ về cách họ tương tác với nhau.Môi trường, (en) bao đóng và khung liên quan như thế nào?

Có lẽ ví dụ về những gì đang diễn ra trong khi gọi hàm sẽ giúp ích? Hoặc có thể là một sơ đồ?

+0

@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. –

+1

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

Trả lời

10

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:

  1. 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.

  2. 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.

  3. 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ó.

  4. 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).

  5. 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) 
+0

Cảm ơn câu trả lời của bạn. R-lang nói một _consists_ môi trường của một khung (bao gồm các ràng buộc biểu tượng/giá trị) và một bao vây (môi trường cha mẹ?), Hơi khác so với # 1. # 4 là khó hiểu vì sự khác biệt giữa R-lang và định nghĩa của bạn trong # 1, và cách R-lang mô tả ngăn xếp cuộc gọi với các từ như "khung đánh giá", "ngữ cảnh" và "môi trường". Tôi không biết nếu đó là 3 điều khác nhau hay tác giả của đoạn văn đó bị lỏng lẻo với thuật ngữ. Đoạn cuối cùng của bạn hơi không rõ ràng. Cảm ơn một lần nữa! –

+0

@JoshuaUlrich - Tôi đã cập nhật câu trả lời của mình. Hy vọng nó làm rõ mọi thứ (rõ ràng là bùn !?) – Tommy

+0

Câu trả lời này có ý nghĩa rất nhiều với tôi. Cảm ơn! – Iterator

5

this extended description by John Fox giải quyết các câu hỏi của bạn không?

Nó có sơ đồ đẹp, nhưng không có ngựa.

Ngoài ra còn có một mô tả trong Fox & Weisberg book, "An R Companion to Applied Regression" (2011), bắt đầu từ p. 417 hoặc phần 8.9.1. Tôi nghĩ rằng PDF ở trên, mặc dù cũ hơn, có lẽ chỉ là thông tin, nếu không nhiều hơn như vậy (vì các sơ đồ). F & W là một cuốn sách hay, tôi đã cắm a couple lần trước, cho other useful stuff. FWIW, tôi không tìm thấy bất kỳ thông tin chi tiết hữu ích nào trong cuốn sách "R in a Nutshell". Tuy nhiên, tôi chưa có bất kỳ cuốn sách nào của Chambers.

Các vấn đề liên quan