有找到跨库文件夹重复的软件包的功能吗?

时间:2018-11-27 09:56:58

标签: r opencpu

我正在维护一个openCPU (R API)实例,该实例具有频繁的软件包更新。 OpenCPU(明智地)将自己的核心程序包划分到不同的文件夹中,以免被安装的版本意外破坏。

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

我通常使用此代码段检查它们。

onClosed()

但是,这并不能解决所有情况(因为它们是五个库路径),并且还删除了与版本不匹配的重复项(实际上并不会造成伤害,有时对于安装软件包而言是必需的)。因此,我想知道是否有人编写了给定库路径向量的函数,该函数检查任何程序包是否在其他库路径中安装了不匹配的版本。

1 个答案:

答案 0 :(得分: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))