如何防止R加载包?

时间:2012-04-03 18:30:18

标签: r package

我在R中使用多核软件包来并行化我的代码。但是,如果加载了tcltk软件包,使用多核软件包的分叉进程将导致R无限期挂起。所以我想阻止tcltk加载。如果任何包试图将其作为依赖项加载,我想要立即出错。这可能吗?

或者,我可以在加载包之后卸载吗?

2 个答案:

答案 0 :(得分: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. 的目录中
  4. 在运行任何其他命令之前,通过执行.libPaths将该目录添加到.libPaths(c("C:/R/Library/dummy/", .libPaths()))
  5. 然后,如果任何软件包尝试加载 tcltk ,它将首先在"C:/R/Library/dummy/"中查找软件包,然后找到其中一个名称,将加载它一会儿(在它之前)通过上述钩子立即分离。)

答案 1 :(得分:1)

避免将特定包作为依赖项加载的另一种方法是,假设您需要的所有函数都不依赖于该包,那么将使用它们的命名空间引用您需要的函数:

lattice::xyplot(1~1)

这样,您不需要使用您的函数加载包,也不会无意中加载问题包。