我想卸载一个包而不必重新启动R(主要是因为重新启动R,因为我尝试了不同的,冲突的包令人沮丧,但可以想象这可以在一个程序中使用一个函数然后另一个 - 虽然命名空间引用可能是一个更好的主意用于此用途).
?library 没有显示任何可以卸载包的选项.
有一种建议是detach可以卸载包,但以下两个失败:
detach(vegan)
Run Code Online (Sandbox Code Playgroud)
错误
detach(vegan):无效name参数
detach("vegan")
Run Code Online (Sandbox Code Playgroud)
错误
detach("vegan"):无效name参数
那么如何卸载包呢?
随着我的代码从版本发展到版本,我知道有一些软件包,我已经找到了更好/更合适的软件包,用于手头的任务或其目的仅限于我现在已经分阶段的一段代码出.
有没有简单的方法来判断在给定的脚本中实际使用了哪些加载的包?我的标题开始变得杂乱无章.
I tried this command
remove(list = ls())
Run Code Online (Sandbox Code Playgroud)
I expect to clear all R environment (Objects, packages)
我正在使用一个包:KML(纵向数据的 k 均值)。
\n\n当加载包时,它会加载 6 个以上的包。
\n\nLoading required package: kml\nLoading required package: clv\nLoading required package: cluster\nLoading required package: class\nLoading required package: longitudinalData\nLoading required package: rgl\nLoading required package: misc3d\nRun Code Online (Sandbox Code Playgroud)\n\n使用完后我试图将其分离。但是,我在尝试时不断收到错误/警告。
\n\n当使用此步骤分离使用detach("package:kml", unload=TRUE)或/和卸载它们时unloadNamespace("kml"),不会出现任何错误,就像已分离一样。
当我检查(.packages()). kml 不再列出,但其他包仍在加载。但是当我检查loadedNamespaces()kml 仍然加载在那里时。现在继续处理下一个包。
detach("package:longitudinalData", unload=TRUE)\nRun Code Online (Sandbox Code Playgroud)\n\n给我一条警告消息:
\n\n\n\n\n警告消息: \xe2\x80\x98longitudinalData\xe2\x80\x99 命名空间无法卸载:
\n
\n 命名空间 \xe2\x80\x98longitudinalData\xe2\x80\x99 由 \xe2\x80\x98kml\xe2\x80\x99 导入所以无法卸载
包的其余部分依赖于“kml”或“longitudinalData”,因此我对所有包都收到相同的消息。包括 kml 和纵向数据在内的所有包仍然列在loadednamespaces 下。
\n\n知道如何卸载它们吗?
\n我遇到了全局范围被附加包 ( sessionInfo()$otherPkgs) 和命名空间 (loadedNamespaces() )。所以我想在我的脚本开始时清除它们。
在这个线程中解决了一半的问题。这个问题的主要区别在于我想卸载命名空间,而不仅仅是分离包。pacman 也很有趣,但似乎也不起作用。
library(dbplyr)
names(sessionInfo()$otherPkgs)
lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""),
detach, character.only = TRUE, unload = TRUE)
# `dbplyr` is detached
names(sessionInfo()$otherPkgs)
Run Code Online (Sandbox Code Playgroud)
但是卸载已加载命名空间的类似方法似乎更具挑战性,因为必须首先卸载依赖于其他名称的包。
这是我的尝试:
# Recursive unload which checks for reverse dependencies (children) along the way
# and unloads them first
myunload <- function(pkg) {
# Get child (reverse-dependent) packages that have loaded namespaces
child_pkgs <- unlist(tools::dependsOnPkgs(pkg, which = c("Depends", "Imports"), reverse = T))
child_pkgs <- child_pkgs[which(child_pkgs %in% loadedNamespaces())]
# Recursively …Run Code Online (Sandbox Code Playgroud) 我试图加载party库并得到以下错误:
Loading required package: zoo
Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) :
namespace ‘lattice’ 0.20-24 is already loaded, but >= 0.20.27 is required
Error: package ‘zoo’ could not be loaded
Run Code Online (Sandbox Code Playgroud)
所以我决定更新同一个会话中的所有包(在R中工作时分离所有包),包括lattice,希望zoo然后在更新party后再正确加载lattice:
pkgs <- names( sessionInfo()$otherPkgs )
pkgs <- paste('package:', pkgs, sep = "")
lapply( pkgs , detach, character.only = TRUE, unload = TRUE)
update.packages(checkBuilt=TRUE, ask=FALSE,
repos="http://r-forge.r-project.org",
oldPkgs=c("lattice","zoo","party")
)
Run Code Online (Sandbox Code Playgroud)
它不起作用(在同一个会话中并且在没有预加载的情况下重新启动之后.RData):
> library(party)
Loading …Run Code Online (Sandbox Code Playgroud)