R - 当导入的包版本太旧时,如何强制安装我的自定义包失败?
R - How Do I Force Installation of My Custom Package to Fail When Imported Package Version is Too Old?
我一直在研究自定义 R 库。我使用来自几个不同包的函数(总是用 :: 限定),所以我将它们添加到我的 DESCRIPTION 文件的 Imports 部分。当我使用 R CMD INSTALL
安装我的包时,如果导入包的版本太旧,我会收到警告,但安装会继续。我如何强制它失败并提醒用户他们需要更新该软件包?我不想将它们中的任何一个添加到 Depends 部分,因为我不想在我的库加载时加载这些额外的包。
示例描述文件:
Depends:
R (>= 3.1.2)
Imports:
dplyr (>= 0.7.0)
如果用户系统上加载了 dplyr 0.5.0,安装会继续,但某些依赖于 dplyr 0.7.0 的功能在调用时会失败。
这是使用 find.package
、packageDescription
和 packageVersion
的可能解决方案:
.onLoad <- function(libname, pkgname) {
myImports <- strsplit(utils::packageDescription(pkgname)[["Imports"]], split = ",\s")[[1]]
if (length(find.package("dplyr", quiet = TRUE)) > 0) {
reqVers <- grep("^dplyr [(]", myImports, value = TRUE)
reqVers <- sub("^dplyr [(]>= ([0-9]+.*[0-9]+).*", "\1", reqVers)
if (check <- utils::packageVersion("dplyr") < reqVers)
stop("Dplyr is version ", utils::packageVersion("dplyr"), " --- this package requires version ", reqVers, " at least")
}
invisible()
}
正如您在评论中所说,通常的做法是将其放入名为 zzz.R
.
的文件中
当然您也可以将 stop
替换为 warning
。
我一直在研究自定义 R 库。我使用来自几个不同包的函数(总是用 :: 限定),所以我将它们添加到我的 DESCRIPTION 文件的 Imports 部分。当我使用 R CMD INSTALL
安装我的包时,如果导入包的版本太旧,我会收到警告,但安装会继续。我如何强制它失败并提醒用户他们需要更新该软件包?我不想将它们中的任何一个添加到 Depends 部分,因为我不想在我的库加载时加载这些额外的包。
示例描述文件:
Depends:
R (>= 3.1.2)
Imports:
dplyr (>= 0.7.0)
如果用户系统上加载了 dplyr 0.5.0,安装会继续,但某些依赖于 dplyr 0.7.0 的功能在调用时会失败。
这是使用 find.package
、packageDescription
和 packageVersion
的可能解决方案:
.onLoad <- function(libname, pkgname) {
myImports <- strsplit(utils::packageDescription(pkgname)[["Imports"]], split = ",\s")[[1]]
if (length(find.package("dplyr", quiet = TRUE)) > 0) {
reqVers <- grep("^dplyr [(]", myImports, value = TRUE)
reqVers <- sub("^dplyr [(]>= ([0-9]+.*[0-9]+).*", "\1", reqVers)
if (check <- utils::packageVersion("dplyr") < reqVers)
stop("Dplyr is version ", utils::packageVersion("dplyr"), " --- this package requires version ", reqVers, " at least")
}
invisible()
}
正如您在评论中所说,通常的做法是将其放入名为 zzz.R
.
当然您也可以将 stop
替换为 warning
。