gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:26:10 28 4
gpt4 key购买 nike

我编写了一个使用 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

这是预期的结果。

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

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

我的情况是我想完全清除加载的包,以便我可以更新它。有没有办法在不重新启动 R 的情况下做到这一点?

编辑 2016/10/28 - 更新了下面的可重现示例
  • 在 Windows 上测试
  • 需要开发工具

  • ...
    # 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)

    最佳答案

    您正在寻找 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 代码,所以我将答案留给 future 的读者。

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

    例如,我知道这会在我当前的 session 中失败:
    > unloadNamespace("magrittr")
    Error in unloadNamespace("magrittr") :
    namespace ‘magrittr’ is imported by ‘stringr’, ‘customFunctions’, ‘dplyr’, ‘tidyr’ so cannot be unloaded

    这里的解决方案是首先卸载(使用 unloadNamespace )所有导入“mypackage”的包。

    如果有很多导入包,你实际上只需重启 R 就可以节省时间。(因为你似乎在谈论自定义本地包,这可能不会发生在你身上,除非你写了其他依赖它的包。)

    关于r - 分离 R 包以升级它的可靠过程是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35170213/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com