检查包是否已安装但未加载

com*_*cho 6 r r-package

建议包开发人员检查用户是否安装了包的典型方法如下:

if (!requireNamespace("package")) {
  stop("Please install package.")
}
Run Code Online (Sandbox Code Playgroud)

requireNamespace加载包(在当前范围内?)并返回 TRUE/FALSE 值。我需要在不加载命名空间的情况下检查包的安装状态。

这样做的原因是因为我正在编写一个knit_printS3 方法(扩展knitr包),并且我正在检查的命名空间在我的方法上下文之外有我想要避免的kableExtra副作用。knit_print

加载后,kableExtra会更改后续调用knitr::kable在全局级别的格式化方式。这样做有充分的理由,但我想在我的 S3 方法内部使用kableExtra,并且不要让最终用户对调用kable我的方法后行为不同的原因感到困惑。knit_print

这就是为什么我想在不加载命名空间的情况下检查命名空间(如果kableExtra未安装,只需调用knitr::normal_print)。

编辑:为了澄清为什么我不认为这是这个问题的重复,这些答案没有特别注意解决方案在安装时是否加载包。事实证明,有些解决方案没有加载有问题的包,但它们没有明显区分。

sha*_*ker 8

使用installed.packages

if ("kableExtra" %in% rownames(installed.packages()) {
    # do something
}
Run Code Online (Sandbox Code Playgroud)