r语言 - 如何导入sf到包中以运行依赖于lwgeom的函数?



我正在构建一个导入{sf}的包,更具体地说,我在我的一个函数中使用st_length()

我最初只添加了{sf}到我的包"Imports",但当我检查它时,我得到了一些{lwgeom}相关的错误:

Running examples in 'gtfstools-Ex.R' failed
The error most likely occurred in:

> base::assign(".ptime", proc.time(), pos = "CheckExEnv")
> ### Name: get_trip_speed
> ### Title: Get trip speed
> ### Aliases: get_trip_speed
> 
> ### ** Examples
> 
> data_path <- system.file("extdata/spo_gtfs.zip", package = "gtfstools")
> 
> gtfs <- read_gtfs(data_path)
> 
> trip_speed <- get_trip_speed(gtfs)
Error in sf::st_length(trips_geometries) : 
package lwgeom required, please install it first

这个错误发生在示例运行时,但是一些类似的错误发生在测试中。

然后我将{lwgeom}添加到Imports。检查运行正常,但最后我得到一个注释:NOTE: Namespaces in Imports field not imported from: 'lwgeom'

处理这种情况的最佳实践是什么?我是否应该在包提交过程中跟踪此注释并将其作为评论发送给CRAN ?

您可以考虑在您的包描述文件的建议字段中添加{lwgeom}包。它应该能奏效。

Dirk Eddelbuettel的文章The Suggests != Depends参考了编写R扩展(WRE)的相关部分,可能对这种情况有用。

章节1.1.3.1(建议的包)如下(截至2021-03-12):

请注意,想要运行示例/测试/小视频的人可能没有可用的建议包(甚至可能无法为该平台安装它)。过去的建议是通过if(require("pkgname"))使它们的使用成为条件条件:如果条件条件是在示例/测试/片段中完成的,这是可以的,尽管如果可能的话,首选使用if(requireNamespace("pkgname"))。

然而,在包代码中使用require进行条件调节并不是一个好的做法,因为它会改变会话其余部分的搜索路径,并且依赖于该包中的函数不被其他require或库调用掩盖。更好的做法是使用像

这样的代码。
if (requireNamespace("rgl", quietly = TRUE)) {
rgl::plot3d(...)
} else {
## do something else not involving rgl.
}

因此,当仅仅将{lwgeom}添加到Suggests工作时,我们可能会遇到这样的问题,即有人运行"精简安装";(即没有建议的包)我的包将无法使用依赖于{lwgeom}的功能。

更重要的是,如果我正在导入的包的作者决定在我的包上运行反向依赖检查,而不安装建议的包,检查将失败,因为我有一些示例,测试和小片段由于没有{lwgeom}可用而失败。

因此,除了在Suggests中列出它之外,我还像WRE建议的那样添加了一些对示例和插图的检查:
*examples/vignette context*
# the examples below require the 'lwgeom' package to be installed
if (requireNamespace("lwgeom", quietly = TRUE)) {
... do something ...
}

在需要{lwgeom}的函数中我增加了:

if (!requireNamespace("lwgeom", quietly = TRUE))
stop(
"The 'lwgeom' package is required to run this function. ",
"Please install it first."
)

并将此位添加到这些函数的测试中(使用{testthat}):

if (!requireNamespace("lwgeom", quietly = TRUE)) {
expect_error(
set_trip_speed(gtfs, "CPTM L07-0", 50),
regexp = paste0(
"The \'lwgeom\' package is required to run this function\. ",
"Please install it first\."
)
)
skip("'lwgeom' package required to run set_trip_speed() tests.")
}

最新更新