library() 中有一个 character.only= 参数。要使detach() 正常工作,您只需添加要分离的内容,在本例中为'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’
按预期工作。并在包不可用或不再可用时抛出错误。
您还可以使用require() 和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’
注意,require() 有一个不可见的输出,您可以使用它来安装丢失的包,只需查看this famous answer。