2011-12-26 31 views
7

Sự khác nhau giữa việc gán giá trị cho tên trong môi trường và thiết lập môi trường của một biến là gì? Tôi không thể tìm ra từ tài liệu.Sự khác biệt giữa gán (..., envir = ...) và môi trường (...) =

ví dụ:

MyTestFunc = function(x) 
{ 
    myVal = "abcde" 

    # what is this doing? why is myVal not in the global environment after 
    # this call? I see it adds an environment attribute to the variable, 
    # but what good is that? 
    environment(myVal) = globalenv() 

    assign("myVal" , myVal , envir = globalenv()) 

    # this seems to copy graphics:::rect to the current environment which seems 
    # to contradict the behavior of environment(myVal) above 
    environment(rect) = environment() 

    # this seems to do the same thing 
    assign("rect" , rect , envir = globalenv()) 
} 

# this prints out rect, but shows <environment: namespace: graphics>! 
rect 

Trả lời

6

Chức năng assign chỉ đơn giản là liên kết với một tên cho một giá trị trong môi trường quy định

?.. Nhưng chức năng thay thế môi trường làm hai việc: mục đích chính của nó là thay đổi môi trường của một sự đóng cửa chức năng, môi trường đó là nơi mà mã của hàm tìm kiếm các hàm và biến toàn cầu, thường là môi trường mà hàm được định nghĩa (Vì vậy, nếu bạn định nghĩa nó tại dấu nhắc nó sẽ sử dụng globalenv), như là một "tiền thưởng", nó chỉ gán thuộc tính .Environment cho các kiểu đối tượng khác.Điều này khá vô ích đối với hầu hết các đối tượng, nhưng được sử dụng bởi các công thức. Điều thứ hai là nó hoạt động như khá nhiều chức năng thay thế khác: nếu tên tồn tại trong môi trường hiện tại nó sửa đổi nó trực tiếp, nếu không nó sẽ tạo ra một bản sao cục bộ và sửa đổi điều đó. Vì vậy, trong trường hợp của bạn, nó tạo một bản sao cục bộ của hàm rect và thay đổi môi trường của nó. Hàm ban đầu vẫn không thay đổi.

# showing names replacement behavior 
f <- function() { 
    names(letters) <- LETTERS 
    letters # the local modified copy 
} 
f() # prints changed letters 
letters # unchanged 
+0

Cảm ơn câu trả lời siêu rõ ràng! – SFun28

1

Bên trong một hàm bạn hỏi và thực hiện:

# what is this doing? why is myVal not in the global environment after this call? 
    # I see it adds an environment attribute to the variable, but what good is that? 
    environment(myVal) = globalenv() 

Vì vậy, bạn không thực sự làm bất cứ điều gì để đối tượng myVal tên "abcde" đó là trong hàm . Thay vào đó, bạn đã tạo một môi trường mới có tên "abcede" bên trong môi trường của hàm. Sau đó bạn được thực thi:

assign("myVal" , myVal , envir = globalenv()) 

Nó tạo biến có tên "myVal" với giá trị chế độ ký tự "abcde" được lấy từ môi trường hàm cục bộ và đặt vào môi trường toàn cục. Nó bây giờ có một thuộc tính có tên là ".Environment". Tuy nhiên, vẫn chưa rõ mục tiêu của bạn là gì, vì môi trường được thiết kế để sử dụng để xác định phạm vi của các hàm . Việc gán môi trường cho một đối tượng dữ liệu chỉ là lạ. Các biến nằm trong môi trường, nhưng dường như không có mục đích hữu ích trong việc thiết lập môi trường của biến số . Vì vậy, tôi nghĩ câu trả lời cho câu hỏi của bạn: ... là những gì tốt mà "nên 'nó không phải là bất kỳ tốt'

+0

Tôi dường như không thể nhân rộng nhận xét của bạn về môi trường (myVal) = globalenv(). Nếu tôi đã tạo ra một môi trường có tên là "abcde" thì môi trường đó ở đâu? Làm cách nào để truy cập? Có vẻ như tôi vừa thêm thuộc tính .Environment vào myVal. Và điều gì giải thích môi trường (rect) = environment()? Mục tiêu của tôi chỉ đơn giản là để hiểu môi trường tốt hơn để tôi có thể khám phá các kịch bản nâng cao hơn. – SFun28

+0

Bạn đã thêm thuộc tính môi trường vào đối tượng ký tự. Nếu bạn gõ "abcde" trong bàn điều khiển sau khi thực hiện một cuộc gọi đến MyTestFunc(), bạn nhận được kết quả đầu ra bao gồm: 'attr (,". Environment ") '. Tôi không có ý tưởng làm thế nào người ta sẽ truy cập vào môi trường đó. Tôi nghĩ rằng điều này nằm dưới DDT từ viết tắt. –

+0

ah, đã hiểu! Tôi đã cập nhật mẫu mã của tôi một chút. Bạn có thể xem. Liệu việc gán() và môi trường() gọi cho rect làm điều tương tự? Và tại sao bản in trực tiếp lại hiển thị một môi trường khác với globalenv? – SFun28

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