2010-08-10 33 views
7

Có thể trong R để bảo vệ tên chức năng (hoặc biến nói chung) để chúng không bị che khuất.Bảo vệ tên hàm trong R

Gần đây tôi đã phát hiện ra rằng điều này có thể là vấn đề khi tạo khung dữ liệu với tên "mới", che dấu một hàm được sử dụng bởi lmer và do đó dừng hoạt động. (Phục hồi dễ dàng khi bạn biết vấn đề là gì, ở đây "rm (mới)" đã làm.)

+0

Một khung dữ liệu không thể ghi đè lên một hàm. Bạn có thể sử dụng cả hai cùng một lúc. – James

+0

"Ghi đè" là từ sai. Mặt nạ? – AndyF

+1

Bản sao của http://stackoverflow.com/questions/936748/declaring-a-const-variable-in-r – hadley

Trả lời

4

Có thể sử dụng môi trường! Đây là một cách tuyệt vời để tách các không gian tên. Ví dụ:

> a <- new.env() 
> assign('printer', function(x) print(x), envir=a) 
> get('printer', envir=a)('test!') 
[1] "test!" 
+2

Tất nhiên, ai đó có thể ghi đè lên 'a' :) – geoffjentry

2

@hdallazuanna khuyến (via Twitter)

new <- 1 
lockBinding('new', globalenv()) 

này có ý nghĩa khi biến là người dùng tạo nhưng không, tất nhiên, ngăn chặn ghi đè lên một chức năng từ một gói.

6

Có một cách giải quyết dễ dàng cho vấn đề của bạn, mà không lo lắng về việc bảo vệ các tên biến (mặc dù chơi với lockBinding trông có vẻ thú vị). Nếu một hàm bị che khuất, như trong ví dụ của bạn, bạn vẫn có thể gọi phiên bản được đeo mặt nạ, với sự trợ giúp của toán tử ::.

Nói chung, cú pháp là packagename::variablename.

(Nếu chức năng bạn muốn chưa được xuất từ ​​các gói, sau đó bạn cần ba dấu hai chấm thay vào đó, :::. Điều này sẽ không áp dụng trong trường hợp này tuy nhiên.)

+0

Không hoạt động nếu tôi đang gọi một hàm , trong một gói, dựa vào một chức năng khác mà vô tình đã bị che khuất. – AndyF

+0

@AndyF yeah đó là một điểm tốt. Tôi thấy một chủ đề trong câu trả lời: R không bảo vệ người dùng khỏi chính họ. Điều này rất giống với Linux. ;) –

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