我想在包命名空間內部推送一個函數,以便它可以訪問該包的內部對象(讓我們使用統計包作爲示例)。我試過使用將對象添加到包命名空間
myfun <- function(x) print(x)
env = loadNamespace("stats")
assign("myfun", myfun , env)
但它被鎖定。所以我試圖解鎖我的對象
unlockBinding("myfun", env)
由於myfun尚不存在,我無法解鎖它。
任何幫助嗎?
我想在包命名空間內部推送一個函數,以便它可以訪問該包的內部對象(讓我們使用統計包作爲示例)。我試過使用將對象添加到包命名空間
myfun <- function(x) print(x)
env = loadNamespace("stats")
assign("myfun", myfun , env)
但它被鎖定。所以我試圖解鎖我的對象
unlockBinding("myfun", env)
由於myfun尚不存在,我無法解鎖它。
任何幫助嗎?
沿@哈德利的解決方案的路線,但使用的命名空間,怎麼樣的環境:
environment(myfun) <- asNamespace('stats')
您可以使用三重冒號運算符:::
來訪問程序包的內部對象。看看,例如,as.roman
和utils:::.roman2numeric
。 (將其與utils::.roman2numeric
進行比較。)這可以幫助您避免必須將函數放入命名空間中。
您可能還想查看mvbutils
軟件包中的dont.lockBindings
,該軟件包會停止名稱空間被鎖定。
如果我理解正確的話,我不能解鎖包的命名空間一旦被鎖定(除用dont.lockBindings重新加載它)。所以不可能在事後添加新的函數。 – 2010-06-22 15:03:43
@Etiennebr:AFAIK你是對的。一旦名字空間被鎖定,你就不能添加到它。我仍然認爲':::'是繼續下去的方法。 – 2010-06-22 15:14:22
爲什麼不只是將新功能的環境設置在正確的位置?
myfun <- function(x) print(x)
environment(myfun) <- as.environment("package:stats")
太好了,非常感謝! – TMS 2016-07-08 09:24:41