【问题标题】:R DESCRIPTION file: is it possible to "conditionally" import packages?R 描述文件:是否可以“有条件地”导入包?
【发布时间】:2019-10-14 12:40:50
【问题描述】:

是否可以在包的说明文件中包含“条件导入”?

例如,我正在开发一个计划系统任务的包。在 Windows 上,这是通过任务计划程序和 taskscheduleR 包实现的,在 unix 上是通过 cronR 包实现的。所以直观地说,执行以下操作会很有用:

DESCRIPTION

Package: pkgname
Version: 0.0.1

[more fields]

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

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

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

【问题讨论】:

  • 您可以创建一个新的包“myschedulewrapper”,根据操作系统,它可以移植到cronRtaskscheduleR。没有任何任务不能用另一层间接解决......

标签: r package r-package


【解决方案1】:

我认为这可能通过编写 R 扩展中所述的 configure shell 脚本来实现。但我没有这样做的经验。你也可以在你的 NAMESPACE 文件中做与平台相关的东西(这在这里没有帮助,但请参阅基本包的源代码 parallel 以获取示例)。

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

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

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

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多