Как узнать, какой пакет был установлен с GitHub в моей библиотеке R?

Я хочу знать, сколько пакетов в моей текущей библиотеке было установлено с GitHub, но не могу найти способ сделать это

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

В этом сообщении 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

Я думал, что могу загрузить все пакеты, а затем запустить 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 - это только 53-й пакет из 100+ пакетов

 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

Большое спасибо за любую помощь !!!


person IloveCatRPython    schedule 06.04.2018    source источник
comment
Вы можете использовать packageDescription("package-name")$Repository для получения этой информации без необходимости загружать пакет - так что, возможно, используйте это как функцию в вашем lapply.   -  person Andrew Gustar    schedule 06.04.2018


Ответы (3)


Используйте исходник. Если вы изучите код для 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)
person Dason    schedule 06.04.2018
comment
Большое спасибо!!! У меня были ошибки при использовании вашего кода. Не могли бы вы проверить обновления в моем вопросе? - person IloveCatRPython; 06.04.2018
comment
@IloveCatRPython вместо dir (.libPaths ()) используйте чистый вектор имен пакетов, которые вы хотите проверить. Это был мой быстрый и грязный способ получить это, но вы можете немного его очистить. installed.packages (), вероятно, лучший способ сделать это. - person Dason; 06.04.2018
comment
Еще раз спасибо! Это очень полезное предложение. Я отправляю ответ, который мне подходит - person IloveCatRPython; 07.04.2018

Благодаря @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
person IloveCatRPython    schedule 06.04.2018
comment
Хотел бы протестировать это решение. Что здесь df? Можете ли вы обновить, чтобы сделать его полностью воспроизводимым? - person Jas; 14.01.2020

Небольшая модификация, которая позволяет вам просматривать ваши библиотеки и определять источник каждой, включая имя репозитория 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)

Создано 14 мая 2019 г. пакетом REPEX (v0.2.1)

person Chuck P    schedule 14.05.2019