簡體   English   中英

如何防止R加載包?

[英]How can I prevent R from loading a package?

我在R中使用多核包來並行化我的代碼。 但是,如果加載了tcltk軟件包,使用多核軟件包的分叉進程將導致R無限期掛起。 所以我想阻止tcltk加載。 如果任何包試圖將其作為依賴項加載,我想要立即出錯。 這可能嗎?

或者,我可以在加載包后卸載它嗎?

如果在附加包裝后立即拆卸包裝是一個很好的解決方案,那么請嘗試以下方法:

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/"查找包,並且,找到該名稱中的一個,將加載它片刻(在它被立即分離之前)鈎子如上所述)。

避免將特定包作為依賴項加載的另一種方法是,假設您需要的所有函數都不依賴於該包,而是使用其命名空間引用您需要的函數:

lattice::xyplot(1~1)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM