Search code examples
rgithubdevtoolsinstall.packages

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


I want to know how many packages in my current library were installed from GitHub but can't find a way to go about it

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

This R-bloggers post showed the versions of the packages but not where they were installed from 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

I thought I could load all the packages then run devtools::session_info() to find what I want https://www.r-bloggers.com/loading-all-installed-r-packages/

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

But then I ran into another problem: loading too many packages at the same time maximal number of DLLs reached.... Package changepoint is only the 53th package out of 100+ packages

 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... 

Edit 1: I used the code suggested by @Dason but had these errors

# 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

Many thanks for any help!!!


Solution

  • Use the source. If you examine the code for devtools::session_info() the relevant info seems to be in devtools::package_info(). The code for package_info is:

    > 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>
    

    Basically the output from utils::packageDescription() is getting passed to devtools::pkg_source(). So if you want you could just check what the output of packageDescription looks like and write a function to identify if the description flags it as a github package or not. I made a first pass at it although I haven't tested extensively.

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

    And then to run it on all of our packages we can just list the folders in .libPaths as such

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