如何在我的R库中找到从GitHub安装的软件包?

Ilo*_*hon 8 r github devtools install.packages

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

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

这篇R-bloggers帖子显示了软件包的版本,但未显示从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
Run Code Online (Sandbox Code Playgroud)

我以为我可以加载所有软件包,然后运行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))
Run Code Online (Sandbox Code Playgroud)

但是后来我遇到了另一个问题:一次加载太多软件包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... 
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助!!!

Das*_*son 10

使用源。如果您检查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>
Run Code Online (Sandbox Code Playgroud)

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

isGithub <- function(pkg){!is.null(packageDescription(pkg)$GithubRepo)}
Run Code Online (Sandbox Code Playgroud)

然后要在我们所有的软件包上运行它,我们可以像这样列出.libPaths中的文件夹

sapply(dir(.libPaths()), isGithub)
Run Code Online (Sandbox Code Playgroud)


Ilo*_*hon 6

感谢@Dason,我终于成功了

查找从 GitHub 安装的包的功能

isGithub <- function(pkg){
    !is.null(packageDescription(pkg)$GithubRepo)
}
Run Code Online (Sandbox Code Playgroud)

获取我本地库中的所有包

my_lib <- as.data.frame(library()$result, stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

检查哪些包来自 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
Run Code Online (Sandbox Code Playgroud)