我如何防止R加载一个包?

我使用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"     

如果(看起来很可能)加载和附加软件包的行为导致了问题,那么您也可以采取类似于对您的问题的评论中描述的策略。 即:

  • 创建一个无害的虚拟包,也称为tcltk
  • 将其放置在名为"C:/R/Library/dummy/"
  • 在运行任何其他命令之前,通过执行.libPaths(c("C:/R/Library/dummy/", .libPaths()))将该目录添加到.libPaths
  • 然后,如果有任何软件包试图加载tcltk ,它将首先在"C:/R/Library/dummy/"查找软件包,并找到其中一个名称,将暂时加载它(在它立即被上述钩)。


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

    lattice::xyplot(1~1)
    

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

    链接地址: http://www.djcxy.com/p/58647.html

    上一篇: How can I prevent R from loading a package?

    下一篇: Caching until data changes in ASP.NET MVC & Entity Framework 4.1