2012-04-03 139 views
7

我在R中使用多核包來並行化我的代碼。但是,如果加載了tcltk程序包,則使用多核程序包進行分叉處理將導致R無限期地掛起。所以我想阻止tcltk加載。如果任何包試圖加載它作爲一個依賴項,我想立即發生錯誤。這可能嗎?如何防止R加載軟件包?

或者,我可以在卸載一個包後它已被加載?

+0

你也許可以有一個單獨的目錄與包sans tcltk。 R無法加載不存在的東西。 – 2012-04-03 18:45:50

+0

我相信tcltk是一個內置包。我想我可以在沒有tcltk支持的情況下編譯R,但這似乎有點極端。 – 2012-04-03 18:54:00

+0

另一個極端的(但也許更好的??)是創建一個名爲'tcltk'的虛擬包,並將它放在單獨的目錄中。然後,只要您的'libPaths'設置爲在該目錄中首先查看,它將始終加載虛擬包。然後你可以使用下面的設置,以便在包加載'tcltk'時引發錯誤:'setHook(hookName = packageEvent(「tcltk」,「onLoad」), value = function(...)stop (「警告:試圖加載tcltk」))'。 (請注意,儘管出現錯誤,程序包仍將被加載)。但似乎必須有一個更清潔的解決方案。 – 2012-04-03 19:01:55

回答

3

如果立即分離它已經連接後的包是一個足夠好的解決方案,那麼你可以試試下面的:

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"  

如果(似乎可能)裝載&非常行爲附加包造成了這個問題,你也可能會採取類似於你對問題的評論中描繪的策略。即:

  1. 創建無害虛設包,也稱爲tcltk
  2. 其放置在一個命名的目錄,例如,"C:/R/Library/dummy/"
  3. 在運行任何其他命令之前,通過執行.libPaths(c("C:/R/Library/dummy/", .libPaths()))將該目錄預先設置爲.libPaths

然後,如果任何包試圖加載tcltk,它首先會尋找包的"C:/R/Library/dummy/",並發現這個名字之一,將加載了一會兒(之前它立刻被描述的鉤脫落以上)。

1

的另一種方式,以避免加載特定的包作爲依賴,基於的假設是沒有的,你需要取決於包裝的功能,將引用您需要的功能使用他們的命名空間:

lattice::xyplot(1~1) 

這樣,您不需要使用函數加載包,也不會無意中加載問題包。