我在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