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!!!
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
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With