【问题标题】:Is there a function to find packages duplicated across library folders?是否有查找跨库文件夹重复的包的功能?
【发布时间】:2018-11-27 09:56:57
【问题描述】:

我正在维护一个经常更新包的openCPU (R API) 实例。 OpenCPU(明智地)将自己的核心包分开到不同的文件夹中,这样它们就不会意外地与已安装的版本脱离同步。

但是,这可能会导致在用户文件夹中安装重复的软件包,当 openCPU API 尝试卸载并重新附加软件包以获得更新版本时,这又会导致错误。我在尝试更新软件包时经常会导致这些问题。

我通常使用这个 sn-p 来检查它们。

ocpubasics <- rownames(installed.packages(lib.loc ="/usr/lib/opencpu/library"))
userpkgs <- rownames(installed.packages(lib.loc="/usr/local/lib/R/site-library"))
(dupe_pkgs <- userpkgs[ userpkgs %in% ocpubasics])
remove.packages(dupe_pkgs, lib="/usr/local/lib/R/site-library")

但是,这并不能涵盖所有情况(因为它们是五个库路径),并且还会删除与版本不匹配的重复项(这不会真正造成伤害,并且有时是安装软件包所必需的)。所以,我想知道是否有人编写了一个函数,给定一个库路径向量,检查是否有任何包在不同的库路径中安装了不匹配的版本。

【问题讨论】:

    标签: r opencpu


    【解决方案1】:

    我最终编写了以下代码;也许它对其他人有用。

    旧包可以隐藏在任何库中

    .libPaths(c( "/usr/local/lib/opencpu/site-library", 
                             "/usr/local/lib/R/site-library",
                             "/usr/lib/R/site-library",
                             "/usr/lib/R/library",   
                            "/usr/lib/opencpu/library"  ))
    

    获取重复包列表

    library(tidyverse)
    pkgs <- installed.packages()
    pkgs <- as.data.frame(pkgs)
    
    dupes <- pkgs %>% select(Package, Version, LibPath) %>% 
        group_by(Package) %>% 
        filter(n_distinct(Version, na.rm = TRUE) > 1) 
    

    查看哪个版本安装在哪个库中

    dupes %>% 
        spread(LibPath, Version) %>% 
        knitr::kable()
    

    删除旧版本的所有重复项

    dupes %>% 
        group_by(Package) %>% 
        arrange(desc(Version)) %>% 
        filter(Version != first(Version)) %>% 
        purrr::pmap(~ remove.packages(..1, ..3))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2020-06-09
      • 2011-08-16
      • 2013-02-25
      • 2020-10-28
      • 2021-11-04
      • 2014-06-30
      • 2020-02-29
      相关资源
      最近更新 更多