如何防止R加载包?

如何防止R加载包?,r,package,R,Package,我正在使用R中的多核包来并行化我的代码。但是,如果加载了tcltk包,则多核包的分叉进程将导致R无限期挂起。因此,我想阻止tcltk加载。如果任何包试图将其作为依赖项加载,我希望立即出现错误。这可能吗 或者,我可以在加载包后卸载包吗?如果在连接包后立即拆下包是一个很好的解决方案,请尝试以下操作: setHook(hookName = packageEvent("tcltk", "attach"), value = function(...) detach(package:tcl

我正在使用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)
    

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

    您可能有一个单独的目录,其中包含包sans tcltk。R无法加载不存在的东西。我相信tcltk是一个内置包。我想我可以在没有tcltk支持的情况下编译R,但这似乎有点极端。另一个极端(但可能更可取??)是创建一个虚拟包,也称为
    tcltk
    ,并将其放在单独的目录中。然后,只要您的
    libPaths
    设置为首先在该目录中查找,它将始终加载虚拟包。然后,您还可以使用设置以下命令,以便在包尝试加载时引发错误:
    setHook(hookName=packageEvent(“tcltk”,“onLoad”),value=function(…)stop(“警告:尝试加载tcltk”)
    。(请注意,尽管出现错误,仍将加载包)。看起来一定有一个更干净的解决方案。无论如何,我能够通过执行
    选项(gsubfn.engine=“R”)
    来解决我的特定问题,这可以防止gsubfn加载tcl。gsubfn作为另一个包的依赖项加载,而gsubfn反过来加载tcl纯粹是为了使用它的regex引擎。上面的代码告诉gsubfn改用R自己的正则表达式引擎。