我在R中使用多核包來並行化我的代碼。但是,如果加載了tcltk程序包,則使用多核程序包進行分叉處理將導致R無限期地掛起。所以我想阻止tcltk加載。如果任何包試圖加載它作爲一個依賴項,我想立即發生錯誤。這可能嗎?如何防止R加載軟件包?
或者,我可以在卸載一個包後它已被加載?
我在R中使用多核包來並行化我的代碼。但是,如果加載了tcltk程序包,則使用多核程序包進行分叉處理將導致R無限期地掛起。所以我想阻止tcltk加載。如果任何包試圖加載它作爲一個依賴項,我想立即發生錯誤。這可能嗎?如何防止R加載軟件包?
或者,我可以在卸載一個包後它已被加載?
如果立即分離它已經連接後的包是一個足夠好的解決方案,那麼你可以試試下面的:
setHook(hookName = packageEvent("tcltk", "attach"),
value = function(...) detach(package:tcltk))
# Try it out
library(tcltk)
# Loading Tcl/Tk interface ... done
# Error in as.environment(pos) : invalid 'pos' argument
search()
# [1] ".GlobalEnv" "package:graphics" "package:grDevices"
# [4] "package:utils" "package:datasets" "package:methods"
# [7] "Autoloads" "package:base"
如果(似乎可能)裝載&非常行爲附加包造成了這個問題,你也可能會採取類似於你對問題的評論中描繪的策略。即:
"C:/R/Library/dummy/"
。.libPaths(c("C:/R/Library/dummy/", .libPaths()))
將該目錄預先設置爲.libPaths
。然後,如果任何包試圖加載tcltk,它首先會尋找包的"C:/R/Library/dummy/"
,並發現這個名字之一,將加載了一會兒(之前它立刻被描述的鉤脫落以上)。
的另一種方式,以避免加載特定的包作爲依賴,基於的假設是沒有的,你需要取決於包裝的功能,將引用您需要的功能使用他們的命名空間:
lattice::xyplot(1~1)
這樣,您不需要使用函數加載包,也不會無意中加載問題包。
你也許可以有一個單獨的目錄與包sans tcltk。 R無法加載不存在的東西。 – 2012-04-03 18:45:50
我相信tcltk是一個內置包。我想我可以在沒有tcltk支持的情況下編譯R,但這似乎有點極端。 – 2012-04-03 18:54:00
另一個極端的(但也許更好的??)是創建一個名爲'tcltk'的虛擬包,並將它放在單獨的目錄中。然後,只要您的'libPaths'設置爲在該目錄中首先查看,它將始終加載虛擬包。然後你可以使用下面的設置,以便在包加載'tcltk'時引發錯誤:'setHook(hookName = packageEvent(「tcltk」,「onLoad」), value = function(...)stop (「警告:試圖加載tcltk」))'。 (請注意,儘管出現錯誤,程序包仍將被加載)。但似乎必須有一個更清潔的解決方案。 – 2012-04-03 19:01:55