2011-12-28 40 views
5

Ai đó có thể giải thích mã sau đây? Tôi đang thay thế các chức năng bố trí trong gói đồ họa với phiên bản của riêng tôi, nhưng nó dường như lại xuất hiện một cách kỳ diệuVĩnh viễn thay thế một chức năng

env = environment(graphics:::layout) 
unlockBinding("layout" , env = env) 
assign("layout" , function(){} , envir = env) 
lockBinding("layout" , env = env) 

# this still shows the original layout function! how is that possible? 
layout 

# this shows function(){} as expected 
graphics:::layout 
+0

tất cả - tôi xin lỗi vì tất cả các câu hỏi liên quan đến môi trường gần đây. Điều này chứng minh là một chủ đề phức tạp và khó hiểu. Nếu có bất kỳ tài liệu đọc được đề nghị nào (ngoài các tệp PDF R chuẩn không hữu ích), hãy cho tôi biết! – SFun28

+1

Đừng xin lỗi; Tôi đã học được rất nhiều từ chính họ. Tôi không có bản thân mình, nhưng tôi đã nghe nói rằng [Chambers] (http://www.amazon.com/Software-Data-Analysis-Programming-Statistics/dp/1441926127/ref=sr_1_9?s=books&ie = UTF8 & qid = 1325110851 & sr = 1-9) cuốn sách là loại R lập trình (như trái ngược với tính toán thống kê) kinh thánh. – joran

+0

Tôi thực sự đã ra lệnh cho cuốn sách đó một giờ trước. =) không thể chờ đợi để xuống nó. Cảm ơn vì những lời động viên, joran! – SFun28

Trả lời

6

Vấn đề là bạn đang gán phiên bản mới của bạn layout với đồ họa namespace, đó là những gì được trả về bởi environment(graphics:::layout). Bạn thay vì muốn chuyển nhượng thành đồ họa đính kèm gói (ví dụ: môi trường xuất hiện là "package:graphics" trên đường dẫn tìm kiếm của bạn).

Trong ví dụ của bạn, khi tìm kiếm layout, R tìm kiếm xuống danh sách các gói gắn liền trả về bởi search(), và tìm thấy bản gốc layout trong package:graphics, trước khi nó bao giờ được thực hiện chức năng bạn đã gán vào namespace:graphics.

Giải pháp là đơn giản, chỉ cần một sự thay đổi của môi trường giao cho env trong dòng đầu tiên: xây dựng hơn

# Assign into <environment: package:graphics> 
# rather than <environment: namespace:graphics> 
env <- as.environment("package:graphics") 

unlockBinding("layout" , env = env) 
assign("layout" , function(){} , envir = env) 
lockBinding("layout" , env = env) 

# Now it works as expected 
layout 
# function(){} 

Một chút, có thể hữu ích đối với một số:

search() # Shows the path along which symbols typed at the command 
      # will be searched for. The one named "package:graphics" 
      # is where 'layout' will be found. 

# None of these return the environment corresponding to "package graphics" 
environment(layout) 
environment(graphics::layout) 
environment(graphics:::layout) 

# This does 
as.environment("package:graphics") 
+0

cảm ơn, Josh! Vậy tại sao 'env = environment (graphics ::: layout)' không hoạt động nhưng 'env <- as.environment (" package: graphics ")' hiện? – SFun28

+1

Xem thêm 'assignInNamespace' - mọi thứ trở nên phức tạp hơn nếu bạn muốn thay đổi phương thức S3. – hadley

+0

@ SFun28: Việc đầu tiên đưa cho bạn môi trường không gian tên mà chỉ sử dụng đồ họa, thứ hai mang đến cho bạn môi trường gói đồ họa mà mọi thứ khác sử dụng. (Tôi không chắc làm thế nào điều này sẽ ảnh hưởng đến các gói đính kèm khác để nhập đồ họa) – hadley

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