如何找出从我的 R 库中的 GitHub 安装了哪个包?

How to find out which package was installed from GitHub in my R library?

我想知道我当前库中有多少包是从 GitHub 安装的,但找不到解决方法

# The number of installed packages in my library
length(.packages(all.available=TRUE))
[1] 145

这个 R-bloggers post 显示了软件包的版本,但没有显示它们的安装位置 https://www.r-bloggers.com/list-of-user-installed-r-packages-and-their-versions/

ip <- as.data.frame(installed.packages()[, c(1, 3:4)])
rownames(ip) <- NULL
ip <- ip[is.na(ip$Priority), 1:2, drop=FALSE]
print(ip, row.names=FALSE)

              Package     Version
                abind       1.4-5
              acepack       1.4.1
                 ade4      1.7-10
            albersusa       0.3.0
        AnnotationDbi      1.40.0
          ansistrings       1.0.0
                  ape         5.0
                  aqp        1.15
                  ash      1.0-15
           assertthat       0.2.0
                astsa         1.8
                ATmet         1.2
              automap      1.0-14
            backports       1.1.2
               base64         2.0
            base64enc       0.1-3
                bazar       1.0.6
               BBmisc        1.11
             beeswarm       0.2.3
                   BH    1.66.0-1

我想我可以加载所有包然后 运行 devtools::session_info() 找到我想要的 https://www.r-bloggers.com/loading-all-installed-r-packages/

lapply(.packages(all.available=TRUE), 
        function(x) library(x, character.only=TRUE))

但后来我 运行 遇到了另一个问题:同时加载太多包 maximal number of DLLs reached...。包 changepoint 只是 100 多个包中的第 53 个包

 Error: package or namespace load failed for ‘changepoint’ in inDL(x, as.logical(local), as.logical(now), ...):
 unable to load shared object 'C:/RCat/library/changepoint/libs/x64/changepoint.dll':
  `maximal number of DLLs reached... 

编辑 1:我使用了@Dason 建议的代码,但出现了这些错误

# empty folder
> sapply(dir(.libPaths()), isGithub)
Error: $ operator is invalid for atomic vectors
In addition: Warning message:
In packageDescription(pkg) :
  DESCRIPTION file of package 'file31043e741b3f' is missing or broken

# only lattice.dll left in lattice/lib/x64  
> sapply(dir(.libPaths()), isGithub)
Error: $ operator is invalid for atomic vectors
In addition: Warning message:
In packageDescription(pkg) :
  DESCRIPTION file of package 'lattice' is missing or broken

非常感谢您的帮助!!!

使用来源。如果您检查 devtools::session_info() 的代码,相关信息似乎在 devtools::package_info() 中。 package_info 的代码是:

> getAnywhere("package_info")
A single object matching ‘package_info’ was found
It was found in the following places
  namespace:devtools
with value

function (pkgs = loadedNamespaces(), include_base = FALSE, libpath = NULL) 
{
    desc <- suppressWarnings(lapply(pkgs, packageDescription, 
        lib.loc = libpath))
    not_installed <- vapply(desc, identical, logical(1), NA)
    if (any(not_installed)) {
        stop("`pkgs` ", paste0("'", pkgs[not_installed], "'", 
            collapse = ", "), " are not installed", call. = FALSE)
    }
    if (!include_base) {
        base <- vapply(pkgs, pkg_is_base, logical(1))
        pkgs <- pkgs[!base]
    }
    pkgs <- sort_ci(pkgs)
    attached <- pkgs %in% sub("^package:", "", search())
    desc <- lapply(pkgs, packageDescription, lib.loc = libpath)
    version <- vapply(desc, function(x) x$Version, character(1))
    date <- vapply(desc, pkg_date, character(1))
    source <- vapply(desc, pkg_source, character(1))
    pkgs_df <- data.frame(package = pkgs, `*` = ifelse(attached, 
        "*", ""), version = version, date = date, source = source, 
        stringsAsFactors = FALSE, check.names = FALSE)
    rownames(pkgs_df) <- NULL
    class(pkgs_df) <- c("packages_info", "data.frame")
    pkgs_df
}
<bytecode: 0x000000000e211f50>
<environment: namespace:devtools>

基本上 utils::packageDescription() 的输出被传递给 devtools::pkg_source()。因此,如果您愿意,您可以只检查 packageDescription 的输出,然后编写一个函数来确定描述是否将其标记为 github 包。尽管我没有广泛测试,但我还是第一次通过了它。

isGithub <- function(pkg){!is.null(packageDescription(pkg)$GithubRepo)}

然后 运行 它在我们所有的包中,我们可以只列出 .libPaths 中的文件夹

sapply(dir(.libPaths()), isGithub)

感谢@Dason,我终于让它工作了

查找从 GitHub

安装的包的函数
isGithub <- function(pkg){
    !is.null(packageDescription(pkg)$GithubRepo)
}

获取本地库中的所有包

my_lib <- as.data.frame(library()$result, stringsAsFactors=FALSE)

检查哪些包来自 GitHub

result <- sapply(my_lib$Package, isGithub)
df <- data.frame(package = names(result), github_or_not = result, 
             stringsAsFactors = FALSE)
head(df[df$result == TRUE, ])

     names.result. result
4           bindr   TRUE
5        bindrcpp   TRUE
6        blogdown   TRUE
9          chroma   TRUE
17          dplyr   TRUE
21          editR   TRUE

稍作修改,允许您浏览库并确定每个库的来源,包括 github 存储库的名称

library(tidyverse)
#> Registered S3 methods overwritten by 'ggplot2':
#>   method         from 
#>   [.quosures     rlang
#>   c.quosures     rlang
#>   print.quosures rlang
#> Registered S3 method overwritten by 'rvest':
#>   method            from
#>   read_xml.response xml2
allmypackages <- as.data.frame(installed.packages())
allmypackages <- allmypackages %>%
  filter(Priority != "base" | is.na(Priority)) %>%
  select(-c(Enhances:MD5sum, LinkingTo:Suggests)) %>%
  droplevels()

package_source <- function(pkg){
  x <- as.character(packageDescription(pkg)$Repository)
  if (length(x)==0) {
    y <- as.character(packageDescription(pkg)$GithubRepo)
    z <- as.character(packageDescription(pkg)$GithubUsername)
    if (length(y)==0) {
      return("Other")
    } else {
      return(str_c("GitHub repo = ", z, "/", y))
    }
  } else {
    return(x)
  }
}

head(sapply(allmypackages$Package, package_source),60)
#>  [1] "CRAN"                            "CRAN"                           
#>  [3] "CRAN"                            "CRAN"                           
#>  [5] "CRAN"                            "CRAN"                           
#>  [7] "CRAN"                            "CRAN"                           
#>  [9] "CRAN"                            "CRAN"                           
#> [11] "CRAN"                            "CRAN"                           
#> [13] "CRAN"                            "CRAN"                           
#> [15] "CRAN"                            "CRAN"                           
#> [17] "CRAN"                            "CRAN"                           
#> [19] "CRAN"                            "CRAN"                           
#> [21] "CRAN"                            "CRAN"                           
#> [23] "CRAN"                            "CRAN"                           
#> [25] "CRAN"                            "CRAN"                           
#> [27] "CRAN"                            "CRAN"                           
#> [29] "CRAN"                            "CRAN"                           
#> [31] "CRAN"                            "CRAN"                           
#> [33] "CRAN"                            "CRAN"                           
#> [35] "CRAN"                            "CRAN"                           
#> [37] "CRAN"                            "CRAN"                           
#> [39] "CRAN"                            "CRAN"                           
#> [41] "CRAN"                            "CRAN"                           
#> [43] "CRAN"                            "CRAN"                           
#> [45] "Other"                           "R-Forge"                        
#> [47] "CRAN"                            "CRAN"                           
#> [49] "CRAN"                            "CRAN"                           
#> [51] "CRAN"                            "CRAN"                           
#> [53] "CRAN"                            "CRAN"                           
#> [55] "CRAN"                            "CRAN"                           
#> [57] "CRAN"                            "CRAN"                           
#> [59] "GitHub repo = cjtexas/colourgen" "CRAN"
allmypackages$whereat <- sapply(allmypackages$Package, package_source)

reprex package (v0.2.1)

于 2019-05-14 创建