如何导入sf到包中来运行依赖于lwgeom的函数?

问题描述 投票:0回答:2

我正在构建一个导入

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

我最初只将

{sf}
添加到我的包“导入”中,但是当我检查它时,我收到了一些与
{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}
添加到导入中。支票运行良好,但最后我收到一张纸条:
NOTE: Namespaces in Imports field not imported from: 'lwgeom'

处理此类案例时的最佳做法是什么?我应该在包提交过程中跟踪此注释并将其作为评论发送给 CRAN 吗?

r package namespaces r-sf gtfstools
2个回答
2
投票

Dirk Eddelbuettel 的 Suggests != Depends 文章提到了 Writing R Extensions (WRE) 的相关部分,可能对这种情况有用。

第 1.1.3.1 节(建议的软件包) 内容如下(截至 2021 年 3 月 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
works 时,我们可能会偶然发现一个问题,即运行我的软件包的“精益安装”(即没有建议的软件包)的人将无法使用以下功能:依靠
{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.")

}

1
投票

您可以考虑在包描述文件的建议字段中添加

{lwgeom}
包。应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.