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")
}
是否可以在包的描述文件中包含 "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")
}