我希望卸载一个包而不必重新启动R(主要是因为在尝试不同的、冲突的包时重新启动R会令人沮丧,但可以想象,这可以在程序中使用一个函数,然后使用另一个函数——尽管名称空间引用可能是更好的使用方法)。

?库没有显示任何卸载包的选项。

有一个建议detach可以卸载包,但以下两个都失败:

detach(vegan)

分离错误(纯素):无效的名称参数

detach("vegan")

分离错误("vegan"):无效的名称参数

那我怎么卸货呢?


当前回答

我想补充一个替代方案。这个解决方案并没有直接回答你卸载包的问题,但是,恕我直言,提供了一个更干净的替代方案来实现你想要的目标,这是我所理解的,广泛关注于避免名称冲突和尝试不同的功能,如前所述:

主要是因为当我尝试不同的、冲突的包时重新启动R是令人沮丧的,但可以想象,这可以在程序中使用一个函数,然后使用另一个函数——尽管命名空间引用可能是更好的使用方法

解决方案

withr包提供的with_package函数提供了以下功能:

将包附加到搜索路径,执行代码,然后从搜索路径中删除包。但是,包名称空间不会被卸载。

例子

library(withr)
with_package("ggplot2", {
  ggplot(mtcars) + geom_point(aes(wt, hp))
})
# Calling geom_point outside withr context 
exists("geom_point")
# [1] FALSE

示例中使用的Geom_point不能从全局名称空间访问。我认为这可能是一种比装卸包裹更干净的处理冲突的方式。

其他回答

当您在脚本之间来回切换时,有时可能只需要卸载一个包。下面是一个简单的IF语句,它可以防止在试图卸载当前未加载的包时出现警告。

if("package:vegan" %in% search()) detach("package:vegan", unload=TRUE) 

在脚本顶部包含这一点可能会有所帮助。

我希望这能让你开心!

detach(package:PackageName)有效,不需要使用引号。

只需转到OUTPUT窗口,然后单击Packages图标(它位于Plot和Help图标之间)。从你想要卸载的包裹上去掉“勾号/对号”。

对于再次使用包装,只需在包装或使用前打勾或检查标记:

library (lme4)

你也可以使用unloadNamespace命令,如下所示:

unloadNamespace("sqldf")

该函数在卸载名称空间之前将其分离。

连接到@tjebo答案。

博士TL; 请使用pkgload:::unload而不是devtools::unload,因为它们是相同的函数(1对1),pkgload是一个更轻的包(没有依赖关系)。Devtools只是重新导出pkgload:::unload函数。

不幸的是,devtools是一个巨大的依赖项(因为devtools有很多自己的依赖项),它更多地是针对开发阶段的。所以如果你想在你自己的包中使用unload函数,或者你关心库的大小,请记住使用pkgload:::unload而不是devtools::unload。Devtools只是重新导出pkgload:::unload函数。

请检查devtools::unload函数的页脚以快速确认重新导出或去github repo

> devtools::unload
function (package = pkg_name(), quiet = FALSE) 
{
    if (package == "compiler") {
        oldEnable <- compiler::enableJIT(0)
        if (oldEnable != 0) {
            warning("JIT automatically disabled when unloading the compiler.")
        }
    }
    if (!package %in% loadedNamespaces()) {
        stop("Package ", package, " not found in loaded packages or namespaces")
    }
    unregister_methods(package)
    unloaded <- tryCatch({
        unloadNamespace(package)
        TRUE
    }, error = function(e) FALSE)
    if (!unloaded) {
        unload_pkg_env(package)
        unregister_namespace(package)
    }
    clear_cache()
    unload_dll(package)
}
<bytecode: 0x11a763280>
<environment: namespace:pkgload>