2012-04-03 107 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) 

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