单独使用R,是否可以将包作为函数中的变量?
我只是在测试加载不同的包,我编写了一个函数,我认为可以根据需要添加和删除包。例如,如果我想加载spatstat:单独使用R,是否可以将包作为函数中的变量?,r,function,package,R,Function,Package,我只是在测试加载不同的包,我编写了一个函数,我认为可以根据需要添加和删除包。例如,如果我想加载spatstat: packagedelivery<-function(fry,leela){ if(fry == TRUE){ library(leela) } else{ detach(leela,unload=TRUE) } } packagedelivery(TRUE,"spatstat") 我在这里遗漏了什么步骤 非常感谢。在库
packagedelivery<-function(fry,leela){
if(fry == TRUE){
library(leela)
} else{
detach(leela,unload=TRUE)
}
}
packagedelivery(TRUE,"spatstat")
我在这里遗漏了什么步骤
非常感谢。在
库()
中有一个字符。仅=
参数。要使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()
有一个不可见的输出,您可以使用它来安装丢失的软件包,只需查看。非标准评估。将“require”与“character.only=TRUE”一起使用。如有疑问,函数用于TRUE而不是FALSE。FALSE条件给出了分离中的错误(leela,unload=TRUE):无效的'name'参数“
该detach
函数还应具有字符。也只有参数。仅使用require
(带或不带字符。仅当您要检查其返回值时才使用,否则它是错误的工具。库(…,character.only=)
存在。可以使用分离(paste0(“package:,leela),unload=TRUE)
,但只有在没有其他仍然加载的包依赖于它的情况下才有效。(此问题也存在于unloadNamespace
,因此不是detach
所独有的)例如,通过添加一个grepl参数来消除所有spatstat包,我遇到了您提到的关于包之间相互依赖的问题。我不知道如何克服这个问题,也不知道这样做是否明智或安全。但是,这样做很有效,我添加了一个额外的grepl参数来消除所有包含我的keyw的包这表明某些软件包是相互依赖的,因此不能按顺序删除。我不知道再这样做是否明智或安全。
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’
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’