2010-06-22 48 views
29

我想在包命名空間內部推送一個函數,以便它可以訪問該包的內部對象(讓我們使用統計包作爲示例)。我試過使用將對象添加到包命名空間

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

但它被鎖定。所以我試圖解鎖我的對象

unlockBinding("myfun", env) 

由於myfun尚不存在,我無法解鎖它。

任何幫助嗎?

回答

28

沿@哈德利的解決方案的路線,但使用的命名空間,怎麼樣的環境:

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

太好了,非常感謝! – TMS 2016-07-08 09:24:41

7

您可以使用三重冒號運算符:::來訪問程序包的內部對象。看看,例如,as.romanutils:::.roman2numeric。 (將其與utils::.roman2numeric進行比較。)這​​可以幫助您避免必須將函數放入命名空間中。

您可能還想查看mvbutils軟件包中的dont.lockBindings,該軟件包會停止名稱空間被鎖定。

+0

如果我理解正確的話,我不能解鎖包的命名空間一旦被鎖定(除用dont.lockBindings重新加載它)。所以不可能在事後添加新的函數。 – 2010-06-22 15:03:43

+0

@Etiennebr:AFAIK你是對的。一旦名字空間被鎖定,你就不能添加到它。我仍然認爲':::'是繼續下去的方法。 – 2010-06-22 15:14:22

14

爲什麼不只是將新功能的環境設置在正確的位置?

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

我不知道!但我想我希望它是名稱空間:統計數據,而不是package:stats。有沒有辦法做到這一點(只是改變它在as.environment()不起作用)。 – 2010-06-23 17:54:17

+1

命名空間不是環境... – hadley 2010-06-24 01:25:42

+7

我遲到了,但這可能對其他人有用:名稱空間實際上是一個環境。 'namespace:stats'是一個_descendent_全局環境幷包含所有的對象。導出的對象被複制到'package:stats',它是全局環境的_ancestor_。 – wch 2012-08-07 00:04:18

相關問題