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