单独使用R,是否可以将包作为函数中的变量?

单独使用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") 我在这里遗漏了什么步骤 非常感谢。在库

我只是在测试加载不同的包,我编写了一个函数,我认为可以根据需要添加和删除包。例如,如果我想加载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’