There's a character.only=
argument in library()
. To get detach()
to work properly you simply need to add what sort of thing is to detach, in this case 'package:'
packagedelivery1 <- function(fry, leela) {
if (fry) {
library(leela, character.only=TRUE)
} else {
detach(sprintf('package:%s', leela), unload=TRUE, character.only=TRUE)
}
}
packagedelivery1(TRUE, "matrixStats")
colSds(matrix(rnorm(9), 3, 3))
# [1] 1.6706355 0.5352099 1.4046043
packagedelivery1(FALSE, "matrixStats") ## first unload
colSds(matrix(rnorm(9), 3, 3))
# Error in colSds(matrix(rnorm(9), 3, 3)) :
# could not find function "colSds"
packagedelivery2(FALSE, "lfe") ## second unload (package not loaded)
# Error in detach(sprintf("package:%s", leela), unload = T, character.only = T) :
# invalid 'name' argument
packagedelivery1(TRUE, "fooPackage")
# Error in library(leela, character.only = TRUE) :
# there is no package called ‘fooPackage’
Works as expected. And throws errors when package is not or no longer available.
You also could create a different function that warns instead of throwing errors, using require()
and unloadNamespace()
:
packagedelivery2 <- function(fry, leela) {
srh <- sprintf("package:%s", leela) %in% search()
if (fry) {
if (srh) {
message(sprintf("Package called '%s' already loaded", leela))
} else {
require(leela, character.only=TRUE)
}
} else {
if (!srh) {
message(sprintf("There was no package called '%s'", leela))
}
unloadNamespace(leela)
}
}
packagedelivery2(TRUE, "matrixStats")
colSds(matrix(rnorm(9), 3, 3))
# [1] 0.4954492 1.1789422 1.1264789
packagedelivery2(FALSE, "matrixStats") ## first unload
colSds(matrix(rnorm(9), 3, 3))
# Error in colSds(matrix(rnorm(9), 3, 3)) :
# could not find function "colSds"
packagedelivery2(FALSE, "matrixStats") ## second unload (package not loaded)
# There was no package called 'matrixStats'
packagedelivery2(TRUE, "fooPackage")
# Loading required package: fooPackage
# Warning message:
# In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
# there is no package called ‘fooPackage’
Note, that require()
has an invisible output that you may use to install a missing package, just look into this famous answer.