【发布时间】:2019-02-22 22:22:14
【问题描述】:
建议包开发者检查用户是否安装包的典型方式如下:
if (!requireNamespace("package")) {
stop("Please install package.")
}
requireNamespace 加载包(在当前范围内?)并返回 TRUE/FALSE 值。我需要在不加载命名空间的情况下检查包的安装状态。
这样做的原因是因为我正在编写一个knit_print S3 方法(扩展knitr 包)并且我正在检查kableExtra 的命名空间在我的knit_print 方法的上下文之外有副作用我想避免。
加载时,kableExtra 会更改后续调用 knitr::kable 在全局级别的格式。这样做有充分的理由,但我想在我的 S3 方法中使用kableExtra,并且不会让最终用户对为什么在调用我的knit_print 方法后kable 的行为有所不同感到困惑。
这就是为什么我想在不加载命名空间的情况下检查命名空间(如果没有安装kableExtra,只需调用knitr::normal_print)。
编辑:为了澄清为什么我不认为这是 this question 的重复,这些答案并没有特别注意解决方案是否加载安装时打包。事实证明,有些解决方案没有加载有问题的包,但它们并没有明显的区别。
【问题讨论】:
-
?installed.packages -
查看stackoverflow.com/a/38082613/1989480 了解更快的方法