【问题标题】:How to deal with implicit package dependency through required function arguments?如何通过所需的函数参数处理隐式包依赖?
【发布时间】:2014-05-01 10:29:19
【问题描述】:

背景:

我正在编写一个小 R 包 RHYPE,用于导入/导出和可视化来自特定水文模型 (HYPE) 的结果。 我刚刚添加了一个地图绘图函数,其中一个参数是SpatialPolygonsDataFrame(参数“数据”),即数据映射到的空间对象,另一个是要附加到空间对象的data 插槽的新数据并稍后绘制(参数“newdata”)。

一些说明函数相关部分的简化代码:

PlotMapOutput <- function(newdata, map) {

  # control argument type
  stopifnot(class(map) == "SpatialPolygonsDataFrame")

  # add data to map table, 
  # merge by common column (assumed to be index 1 in both tables)
  map@data <- data.frame(map@data, data[match(map@data[, 1], newdata[, 1]), ]) 

  # plot the map
  plot(map, col = map$color, border = NA)
}

这是我的问题:

通过要求SpatialPolygonsDataFrame,我隐式要求我的函数的用户安装和加载包sprgdal(或其他用于导入空间数据的包)。但是,我也明确使用这些包中的方法。我必须将这些包添加到描述文件的Imports: 部分吗?我开始阅读 Depends vs. Imports 并且对如何编写方法的导入感到困惑,然后偶然发现了隐式要求。

感谢任何澄清的cmets!

【问题讨论】:

  • 您可以使它们成为依赖项,但前提是这些包对于运行您的包是绝对必要的。如果它们不是绝对必要的,您还可以“借用”其他包中使用的函数的源代码。
  • @RichardScriven 谢谢,在这种情况下,许多其他函数根本不依赖于 sp,所以这里的依赖似乎有点过头了。

标签: r


【解决方案1】:

是的,您需要将其中一个包添加到Imports:(在您的DESCRIPTION), 但是另外你还需要好好利用 NAMESPACE文件,即有一行

importClassesFrom("sp", spatialPolygonsDataFrame)

如果关于命名空间的阅读太难,我会使用其他(质量很好!)包作为示例。

sp 包本身就是一个很好的学习示例。

【讨论】:

  • 谢谢马丁,这听起来很合理。我使用 roxygen,所以我尝试将其添加到函数中:#' @importClassesFrom sp SpatialPolygonsDataFrame SpatialPolygons#' @importMethodsFrom sp plot.SpatialPolygons 在 NAMESPACE 中产生以下行: importClassesFrom(sp,SpatialPolygons) importClassesFrom(sp,SpatialPolygonsDataFrame) importMethodsFrom(sp,"plot.SpatialPolygons")但是,在构建时,R 会返回:No methods found in "sp" for requests: plot.SpatialPolygons
  • 很抱歉布局乱码,我是新来的。添加到前面的评论:plot.SpatialPolygons 不是从 sp 导出的,这是否意味着我不能将它单独导入到我的包的搜索路径中?谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
相关资源
最近更新 更多