Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 663
IloveCatRPython Avatar asked Apr 06 '18 17:04

IloveCatRPython


2 Answers

Thanks to @Dason, I finally got this to work

Function to find packages installed from GitHub

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

Get all packages in my local library

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

Check which packages are from 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
like image 118
IloveCatRPython Avatar answered Sep 29 '22 18:09

IloveCatRPython


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)
like image 45
Dason Avatar answered Sep 29 '22 18:09

Dason