为了升级R包,分离R包的可靠过程是什么?

为了升级R包,分离R包的可靠过程是什么?,r,devtools,install.packages,R,Devtools,Install.packages,我编写了一个使用devtools包含内部数据的包: devtools::use_data(.data, internal = T, overwrite = T) 我最近更改了数据并重建了包。我想在另一台当前已加载旧程序包的计算机上升级该程序包: detach('package:myPackage', unload=T) remove.packages('myPackage') install.packages(repos=NULL, 'myPackage.zip') 我检查是否已完成更改:

我编写了一个使用devtools包含内部数据的包:

devtools::use_data(.data, internal = T, overwrite = T)
我最近更改了数据并重建了包。我想在另一台当前已加载旧程序包的计算机上升级该程序包:

detach('package:myPackage', unload=T)
remove.packages('myPackage')
install.packages(repos=NULL, 'myPackage.zip')
我检查是否已完成更改:

length(myPackage:::.data[[1]])
[1] 2169
不是我所期望的。。。也许重启会有帮助

Restarting R session...
length(myPackage:::.data[[1]])
[1] 2179
这是预期的结果

阅读分离的帮助表明,在某些情况下,分离可能是不稳定的,例如:

如果在已加载命名空间的包上使用库,它会附加已加载命名空间的导出。因此,分离和重新连接包可能不会刷新包的部分或全部组件,这是不可取的

我的情况是,我想完全清除加载的包,以便更新它。有没有一种方法可以在不重新启动R的情况下执行此操作


编辑2016/10/28-使用以下可复制示例更新

  • 在windows上测试
  • 需要开发工具

#临时目录中的安装程序包

pkg_dir如果不想重新启动R会话,获取新数据的安全方法是保存数据,例如

save(.data, "data.rda")
将它们复制到另一台机器上

load("data.rda")

您正在查找
unloadNamespace
。我使用它的确切目的,你描述的所有时间

只需按顺序调用:

# this may fail, see below
unloadNamespace("mypackage")
# if it succeeds you're all good

# updating the package
install.packages("mypackage")

# reloading the updated package
library("mypackage")
我从来没有遇到过任何问题,无论是从源代码/二进制文件安装,还是从本地/CRAN/github安装,带/不带packrat,等等

编辑:这并不能解决OP的特定问题,即更新包数据。然而,它在大多数简单的情况下都能很好地工作,例如更新一些R代码,所以我将把答案留给未来的读者

但是,可能发生的情况是,目标包实际上是由当前加载的其他包导入的。在这种情况下,卸载失败

例如,我知道这将在我当前的会话中失败:

> unloadNamespace("magrittr")
Error in unloadNamespace("magrittr") : 
  namespace ‘magrittr’ is imported by ‘stringr’, ‘customFunctions’, ‘dplyr’, ‘tidyr’ so cannot be unloaded
这里的解决方案是首先卸载(使用
unloadNamespace
)导入“mypackage”的所有包


如果有很多导入包,您只需重新启动R就可以节省时间(因为您似乎在谈论自定义本地包,除非您根据它编写了其他包,否则这种情况可能不会发生在您身上。)

不要认为您可以安全地执行此操作。重新启动R时有问题吗?需要一些时间。我也有同样的“问题”。我很好奇别人做什么。我要做的是:删除软件包,关闭r,打开r,安装同名的新软件包。两个随机问题:1)您的环境中是否有一个名为“T”的变量?2) 在
detach(…,unload=TRUE)
之后调用
gc()
是否执行了其他操作?请尝试卸载命名空间,而不是将其分离。我没有任何名为t的变量。gc()无法解决此问题。unloadNamespace也没有帮助。不幸的是,
unloadNamespace
似乎也没有帮助。我添加了一个可复制的示例来演示。@logworthy;事实上,它的行为并不符合数据文件的预期(尽管它在更简单的场景中工作得很好,比如R代码)。。。我不知道为什么!我做了很多实验,但根本无法让它工作。这是R内部的一个特性,可能是一个bug。你最好在R-devel邮件列表()上问一下,在哪里你可以找到最了解这些事情的人。祝你好运!
> unloadNamespace("magrittr")
Error in unloadNamespace("magrittr") : 
  namespace ‘magrittr’ is imported by ‘stringr’, ‘customFunctions’, ‘dplyr’, ‘tidyr’ so cannot be unloaded