2010-06-22 34 views
29

Tôi muốn đẩy một hàm bên trong vùng tên gói để nó có thể truy cập các đối tượng bên trong của gói đó (hãy sử dụng gói thống kê làm ví dụ). Tôi đã thử sử dụngThêm đối tượng vào không gian tên gói

myfun <- function(x) print(x) 
env = loadNamespace("stats") 
assign("myfun", myfun , env) 

Nhưng nó bị khóa. Vì vậy, tôi đã cố gắng mở khóa đối tượng của mình

unlockBinding("myfun", env) 

Vì myfun chưa tồn tại nên tôi không thể mở khóa.

Bất kỳ trợ giúp nào?

Trả lời

28

Dọc theo dòng giải pháp @ Hadley, nhưng sử dụng môi trường của không gian tên, làm thế nào về:

environment(myfun) <- asNamespace('stats') 
+0

tuyệt vời, cảm ơn rất nhiều! – TMS

7

Bạn có thể truy cập các đối tượng bên trong của gói bằng cách sử dụng toán tử dấu hai chấm :::. Hãy xem, ví dụ: as.romanutils:::.roman2numeric. (So ​​sánh điều này với utils::.roman2numeric.) Điều này có thể giúp bạn tránh phải đặt hàm của bạn bên trong vùng tên.

Bạn cũng có thể muốn xem dont.lockBindings trong gói mvbutils, ngăn chặn không gian tên bị khóa.

+0

Nếu tôi hiểu đúng, tôi không thể mở khóa Namespace của một gói khi nó bị khóa (trừ bởi tải lại nó với dont.lockBindings). Vì vậy, nó không thể thêm một chức năng mới một posteriori. –

+0

@Etiennebr: AFAIK bạn là chính xác. Khi không gian tên bị khóa, bạn không thể thêm vào đó. Tôi vẫn nghĩ rằng ':::' là cách để tiến hành. –

14

Tại sao không chỉ thiết lập môi trường của chức năng mới của bạn đến đúng nơi?

myfun <- function(x) print(x) 
environment(myfun) <- as.environment("package:stats") 
+0

Tôi không biết điều đó! Nhưng tôi nghĩ rằng tôi muốn nó được không gian tên: số liệu thống kê thay vì gói: số liệu thống kê. Có cách nào để làm điều đó (chỉ cần thay đổi nó trong as.environment() không hoạt động). –

+1

Không gian tên không phải là môi trường ... – hadley

+7

Tôi đến muộn với bữa tiệc, nhưng điều này có thể hữu ích cho người khác: Không gian tên thực sự là một môi trường. 'namespace: stats' là _descendent_ môi trường toàn cầu và chứa tất cả các đối tượng. Các đối tượng đã xuất được sao chép sang 'package: stats', là một _ancestor_ của môi trường toàn cục. – wch

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