首页 文章

重新安装GNU R中的所有包

提问于
浏览
2

有时,你遇到了一个问题,在GNU R中Hadley Wickham recommends

我建议您重新安装所有软件包 .

问题是如何以最好的方式做到这一点 . 我知道install.packages将overwrite existing versions .

当只使用CRAN包时(GitHub或其他来源没什么特别的),这种天真的方法对我有用:

my.packages <- rownames(installed.packages());
install.packages(my.packages);

但是,如果我有installed dev versions from GitHub,或者使用了一些未公开共享的本地软件包,我该怎么办?

我正在寻找的方法是:

  • 检查新安装对软件包的更改(升级/降级)

  • 从同一来源再次安装包

  • 备份我的旧包文件夹

是否有可以满足这些要求的脚本?

2 回答

  • 1

    ((1)的部分解决方案 - 找出将升级/降级的软件包)

    my.packages <- installed.packages();
    my.avail <- available.packages();
    
    z <- merge(
          my.packages[,c("Package","Version")],
          my.avail[,c("Package","Version")],
          by = "Package", suffixes = c('.my','.avail'));
    
    z$Version.my <- as.character(z$Version.my)
    z$Version.avail <- as.character(z$Version.avail)
    
    # my packages which will be upgraded
    subset(z, Version.my < Version.avail)
    
    # my packages that will be downgraded
    subset(z, Version.my > Version.avail)
    

    我认为这只是近似的 - 取决于依赖关系,您可能无法获得所有升级 . 但是如果使用开发版本,你会看到降级的预期吗?

  • 1

    您可以尝试以下方法 .

    libLoc<-.libPaths()[1]
    update.packages(lib.loc = libLoc, instlib = libLoc, checkBuilt = TRUE, ask = FALSE)
    

    这里 lib.loc 是您要更新的现有软件包的位置, instlib 是新软件包的位置(在上面的示例代码段中相同) . 如果要更新所有现有软件包(不仅仅是 libLoc 中的软件包),而是将所有新更新的软件包放在 instlib 位置,请避免传递 lib.loc 或将其设置为 NULL . 有关更多信息,请查看 update.packages 功能的文档 .

    当我遇到包装问题时我使用了这个,并且在我拥有有限权限的远程系统上从旧版本升级到R-3.5之后不得不重新安装它们 .

    希望这可以帮助 .

相关问题