我正在维护一个openCPU (R API)实例,该实例具有频繁的软件包更新。 OpenCPU(明智地)将自己的核心程序包划分到不同的文件夹中,以免被安装的版本意外破坏。
但是,这可能会导致在用户文件夹中安装重复的软件包,然后在openCPU API尝试卸载并重新附加软件包以获取较新版本时又导致错误。尝试更新软件包时,我经常会引起这类问题。
我通常使用此代码段检查它们。
onClosed()
但是,这并不能解决所有情况(因为它们是五个库路径),并且还删除了与版本不匹配的重复项(实际上并不会造成伤害,有时对于安装软件包而言是必需的)。因此,我想知道是否有人编写了给定库路径向量的函数,该函数检查任何程序包是否在其他库路径中安装了不匹配的版本。
答案 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))