分离R软件包以升级它的可靠过程是什么?

时间:2016-02-03 06:43:04

标签: 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')

我检查一下这些变化是否已经完成:

length(myPackage:::.data[[1]])
[1] 2169

不是我所期待的......也许重启会有所帮助吗?

Restarting R session...
length(myPackage:::.data[[1]])
[1] 2179

预期结果是什么。

阅读分离的帮助表明它在某些情况下可能会出现片状,例如:

如果在加载了命名空间的包上使用库,它会附加已加载的命名空间的导出。因此,分离和重新附加包可能不会刷新包的某些或所有组件,并且是不可取的。

我的情况是,我想彻底清除加载的包,以便我可以更新它。有没有办法在不重新启动R的情况下执行此操作?

编辑2016/10/28 - 使用下面的可重复示例进行更新

  • 在Windows上测试
  • 需要devtools

...

# setup package in temp dir
pkg_dir <- file.path(tempfile(), 'dummy.test.pkg')
dir.create(pkg_dir, recursive=T)
devtools::create(pkg_dir)
setwd(pkg_dir)

# read description
desc <- readChar('DESCRIPTION', file.size('DESCRIPTION'))

# create and build package v01
.testval <- c(1,2,3)
devtools::use_data(.testval, internal=T, overwrite=T)
v01 <- sub('\\d+\\.\\d+\\.\\d+\\.\\d+', '0.0.0.1', desc, perl=T)
writeChar(v01, 'DESCRIPTION')
bin01 <- devtools::build(binary=T, path='.')

# create and build package v10
.testval <- c(4,5,6)
devtools::use_data(.testval, internal=T, overwrite=T)
v01 <- sub('\\d+\\.\\d+\\.\\d+\\.\\d+', '1.0.0.0', desc, perl=T)
writeChar(v01, 'DESCRIPTION')
devtools::build(binary=T, path='.')
bin10 <- devtools::build(binary=T, path='.')

# up to this point we haven't loaded either package
sessionInfo()

# install v01
install.packages(repos=NULL, bin01)
cat(dummy.test.pkg:::.testval)
# 1 2 3 (as expected)

# unload the package
unloadNamespace('dummy.test.pkg')

# install v10
install.packages(repos=NULL, bin10)
cat(dummy.test.pkg:::.testval)
# 1 2 3 (NOT 4 5 6 which we expected)

### restart R here ###
cat(dummy.test.pkg:::.testval)
# 4 5 6 (as expected)

2 个答案:

答案 0 :(得分:2)

您正在寻找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)所有导入的包#34; mypackage&#34;。

如果有很多导入软件包,你实际上可以节省时间只需重新启动R.(因为你似乎在谈论自定义本地软件包,除非你已经编写了其他软件包,否则这可能不会发生在你身上取决于它。)

答案 1 :(得分:0)

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

save(.data, "data.rda")

将它们复制到另一台机器上

load("data.rda")