如何在不重新启动 R 的情况下卸载包
我想卸载一个包而不必重新启动 R (主要是因为当我尝试不同的、冲突的包时重新启动 R 会变得令人沮丧,但可以想象,这可以在程序中使用一个函数,然后使用另一个函数 - 尽管名称空间对于这种用途,引用可能是一个更好的主意)。
?library
不显示任何会卸载包的选项。
有一个建议,分离< /code> 可以卸载包,但以下都失败:
detach(vegan)
detach(vegan)
中的错误:name
参数无效
detach("vegan")
detach("vegan")
中的错误:name
参数无效
那么如何卸载包呢?
I'd like to unload a package without having to restart R (mostly because restarting R as I try out different, conflicting packages is getting frustrating, but conceivably this could be used in a program to use one function and then another--although namespace referencing is probably a better idea for that use).
?library
doesn't show any options that would unload a package.
There is a suggestion that detach
can unload package, but the following both fail:
detach(vegan)
Error in
detach(vegan)
: invalidname
argument
detach("vegan")
Error in
detach("vegan")
: invalidname
argument
So how do I unload a package?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
尝试一下(请参阅
?detach
了解更多详细信息):可以一次加载包的多个版本(例如,如果您在不同的库中有一个开发版本和一个稳定版本)。为了保证所有副本都被分离,请使用此功能。
用法是,例如
或
Try this (see
?detach
for more details):It is possible to have multiple versions of a package loaded at once (for example, if you have a development version and a stable version in different libraries). To guarantee that all copies are detached, use this function.
Usage is, for example
or
您还可以使用
unloadNamespace
命令,如下所示:该函数在卸载命名空间之前将其分离。
You can also use the
unloadNamespace
command, as in:The function detaches the namespace prior to unloading it.
您可以取消选中 RStudio(包)中的复选框按钮。
You can uncheck the checkbox button in RStudio (packages).
我尝试了 kohske 写的答案,但再次出错,所以我做了一些搜索,发现这对我有用(R 3.0.2):
或者也
I tried what kohske wrote as an answer and I got error again, so I did some search and found this which worked for me (R 3.0.2):
or also
当您在脚本之间来回切换时,有时可能只需要卸载包。这是一个简单的 IF 语句,可以防止在您尝试卸载当前未加载的包时出现的警告。
将其包含在脚本顶部可能会有所帮助。
我希望这会让你开心!
When you are going back and forth between scripts it may only sometimes be necessary to unload a package. Here's a simple IF statement that will prevent warnings that would appear if you tried to unload a package that was not currently loaded.
Including this at the top of a script might be helpful.
I hope that makes your day!
detach(package:PackageName)
可以工作,不需要使用引号。detach(package:PackageName)
works and there is no need to use quotes.另一种选择是
这显然也解决了注册的S3方法未删除的问题 与
unloadNamespace()
Another option is
This apparently also deals with the issue of registered S3 methods that are not removed with
unloadNamespace()
另请注意,您只能使用
unload()
一次。如果您第二次使用它而不重新运行library()
,您将收到信息不多的错误消息 invalid 'name' argument:Created on 2020- 05-09 由 reprex 包 (v0.3.0)
Note also that you can only use
unload()
once. If you use it a second time without rerunninglibrary()
, y'll get the not very informative error message invalid 'name' argument:Created on 2020-05-09 by the reprex package (v0.3.0)
您可以使用
unloadNamespace()
尝试删除某个包(及其带来的所有依赖项),但内存占用将依然坚持。不,detach("package:,packageName", unload=TRUE, force = TRUE)
也不起作用。从全新的控制台或
Session >重新启动 R
使用pryr
包检查内存:检查我的
sessionInfo()
让我们加载
Seurat
包并检查新的 内存占用:让我们使用
unloadNamespace()
删除所有内容:现在检查
sessionInfo()
:检查内存占用:
<一个href="https://twitter.com/MattOldach/status/1217595535844106240" rel="noreferrer">截屏演示链接
You can try all you want to remove a package (and all the dependencies it brought in alongside) using
unloadNamespace()
but the memory footprint will still persist. And no,detach("package:,packageName", unload=TRUE, force = TRUE)
will not work either.From a fresh new console or
Session > Restart R
check memory with thepryr
package:Check my
sessionInfo()
Let's load the
Seurat
package and check the new memory footprint:Let's use
unloadNamespace()
to remove everything:Now check
sessionInfo()
:Check the memory footprint:
Link to screen-cast demonstration
我想添加一个替代解决方案。该解决方案不会直接回答您关于卸载软件包的问题,但恕我直言,它提供了一种更清晰的替代方案来实现您期望的目标,据我所知,它广泛关注避免名称冲突并尝试不同的功能,例如指出:
解决方案
函数
with_package
通过withr
包提供了以下可能性:示例中使用的示例
geom_point
无法从全局命名空间访问。我认为这可能是比加载和卸载包更干净的处理冲突的方法。I would like to add an alternative solution. This solution does not directly answer your question on unloading a package but, IMHO, provides a cleaner alternative to achieve your desired goal, which I understand, is broadly concerned with avoiding name conflicts and trying different functions, as stated:
Solution
Function
with_package
offered via thewithr
package offers the possibility to:Example
geom_point
used in the example is not accessible from the global namespace. I reckon it may be a cleaner way of handling conflicts than loading and unloading packages.与@tjebo 答案相连。
TL;博士
请使用
pkgload:::unload
而不是devtools::unload
,因为它们是相同的函数(1 比 1),并且pkgload
是一个非常多的函数。更轻的包(依赖项的数量)。devtools
只是重新导出pkgload:::unload
函数。不幸的是,
devtools
是一个巨大的依赖项(因为devtools
有很多自己的依赖项),它更有针对性的开发阶段。因此,如果您想在自己的包中使用unload
函数或者您关心库大小,请记住使用pkgload:::unload
而不是devtools::卸载。
devtools
只是重新导出pkgload:::unload
函数。请检查 devtools::unload 函数的页脚以快速确认重新导出或转到 github回购协议
Connected with @tjebo answer.
TL;DR
Please use
pkgload:::unload
instead ofdevtools::unload
as they are the same function (1 to 1) andpkgload
is a much lighter package (nr of dependencies).devtools
simply reexporting thepkgload:::unload
function.Unfortunately
devtools
is a huge dependency (asdevtools
has a lot of own dependencies), which is more development stage targeted. So if you want to use theunload
function in your own package or you care about library size please remember to usepkgload:::unload
instead ofdevtools::unload
.devtools
simply reexporting thepkgload:::unload
function.Please check the footer of the
devtools::unload
function to quickly confirm the reexport or go to the github repo只需转到“输出”窗口,然后单击“包”图标(它位于绘图和帮助图标之间)。从您想要卸载的包裹中删除“勾号/复选标记”。
要再次使用该包,只需在包前面添加“勾号或复选标记”或使用:
Just go to OUTPUT window, then click on Packages icon (it is located between Plot and Help icons). Remove "tick / check mark" from the package you wanted be unload.
For again using the package just put a "tick or Check mark" in front of package or use :