R DESCRIPTION 文件:是否可以 "conditionally" 导入包?

R DESCRIPTION file: is it possible to "conditionally" import packages?

是否可以在包的描述文件中包含 "conditional import"?

例如,我正在开发一个安排系统任务的包。在 Windows 上,这是通过 Task Scheduler 和 taskscheduleR package, on unix with the cronR 包实现的。所以直觉上做如下的事情会很有用:

DESCRIPTION

Package: pkgname
Version: 0.0.1

[more fields]

Imports:
    dplyr,
    if (.Platform$OS.type == "windows") "taskscheduleR" else "cronR",
    tidyr

我想可以编写一个 .onAttach() 或类似的程序来检查系统类型并安装相关的软件包(如果不存在的话),但这似乎不是一个特别好的解决方案 - 首先,它依赖于用户在连接到网络时附加包,然后才能使用它,其次它打破了正式的依赖链。

我目前的做法是在 Suggests 中包含这两个包,然后由用户负责为他们的系统安装正确的包。

我认为这可以通过编写 R 扩展中描述的 configure shell 脚本实现。但我没有这样做的经验。您还可以在 NAMESPACE 文件中执行与平台相关的操作(这在这里无济于事,但请参阅基础包的来源 parallel 作为示例)。

您可以通过使用 "The R and man subdirectories may contain OS-specific subdirectories named unix or windows." 来帮助您的用户。这允许您拥有 OS 特定代码,然后可以执行通常的包可用性检查。

例如,在 windows 子目录中,您会有类似的内容:

if (requireNamespace("taskscheduleR", quietly = TRUE)) {
      taskscheduleR::taskscheduler_create(...)
   } else {
      stop("Please install the taskscheduleR package to use this functionality")
   }