这是我在 StackOverflow 上发布的第一个问题,因此请更正我犯的任何协议错误。但是我已经从对网站上许多其他问题的回答中受益匪浅,所以在我继续之前,我要感谢为该网站做出贡献的社区。
概述
我在 Windows 7 机器上使用 R、RStudio、包和包(devtools
问题结尾处完整)roxygen2
session_info
我正在尝试编写自己的包,它SpatialLines
从包中定义了 S4 类的子类sp
,并且还使用了包rgeos
。document
当我使用 devtools和
load_all
我的包时,我的问题与我不太了解且无法完全解决的警告消息有关。
警告信息
第一条消息是
class "Spatial" is defined (with package slot ‘sp’) but no metadata object found to revise subclass information---not exported? Making a copy in package ‘minweSpatialNULL’
当我解决这个问题时,通过在 NAMESPACE 文件中添加一个条目(不完全理解为什么它是必要的),然后对DESCRIPTION 文件进行进一步的更改,我收到了第二条消息,到目前为止我已经被打败了。
d> devtools::document()
Updating minweSpatialNULL documentation
Loading minweSpatialNULL
Error: class "SpatialLinesNULL" is not exported by 'namespace:rgeos'
我所尝试的,以及我留下的问题
我已经用谷歌搜索并搜索了几个寻找提示的网站,但我找到的最接近的是 2011 年 12 月的一个简短线程,询问 SpatialLinesNULL 来自哪里 --- 答案是rgeos
。
http://lists.r-forge.r-project.org/pipermail/rspatial-devel/2011-December/000033.html
我已经尝试自己尝试了解出了什么问题,并在调试器中逐步执行代码,直到我迷路为止,这比我能够很好地理解应该发生的事情要深入得多。在此过程中产生了一个小(非)问题的工作示例,如下所示。
我有 3 个问题。它们在此处进行了总结,但实际上仅在下面我的(非)工作玩具示例的上下文中才有意义:
- 问题 1(在 test1 之后)为什么 R 仍然需要(虚拟?)超类
Spatial
,为什么只有在我的代码中定义了第二代MyClass2
时?
澄清补充说@importClassesFrom
,我曾认为,一旦我编辑了我实际使用的类,R 打包命名空间机制就会满足查找和访问前项/超类的任何需要。 - 问题 2(在 test3 之后)我假设无论我的第一条警告消息的原因是什么,也是这个类似消息的原因。
我在正确的轨道上吗? - 问题 3(在 test4 之后)来自 test3 的警告和随后的错误是我可以自己解决的吗(如果可以的话)?还是我需要向
rgeos
软件包的维护者寻求帮助(例如要求他们导出SpatialLinesNULL
)?
代码示例
我的玩具工作示例的 r 代码(仅去除 roxygen 注释以节省空间)是:
MyClass1 <- setClass('MyClass1', contains = c('SpatialLines'))
MyClass2 <- setClass('MyClass2', contains = c('MyClass1'))
MyClass2 第二代子类似乎很重要(没有它,警告就会消失)。我不懂为什么。
devtools
我使用and
对此代码运行了一系列测试roxygen2
。测试因 NAMESPACE 文件中的内容以及DESCRIPTION 文件中的 Imports 指令中的内容而异。执行测试包括在 RStudio 中运行devtools::load_all()
(或沿途devtools::document()
调用)。load_all()
发生的警告消息已在上面发布。我在每次测试之间在干净的全局环境中重新启动我的 R 会话(警告仅在我第一次运行时出现load_all
或document
)。
在跟进下面给出的答案时,我意识到我也应该尝试从 shell 命令行使用 R 构建和安装我的玩具包。
测试1
test1 有DESCRIPTION文件条目(完整的DESCRIPTION文件见这个问题的结尾):
Imports:
methods,
sp
完整的 NAMESPACE 文件(从上面省略的 roxygen 注释生成)是:
# Generated by roxygen2 (4.1.0.9001): do not edit by hand
importClassesFrom(sp,SpatialLines)
importFrom(sp,SpatialLines)
尝试在重新启动的 R 会话中运行devtools::load_all()
(或devtools::document()
)会生成第一个警告(如上所示)。
问题 1为什么 R 需要 ~~(virtual?)~~ 超类Spatial
,为什么只有MyClass2
在我的代码中定义了第二代时? 澄清补充说@importClassesFrom
,我曾认为,一旦我编辑了我实际使用的类,R 打包命名空间机制就会满足查找和访问前项/超类的任何需要。
测试2
test2通过更新 NAMESPACE 文件来解决问题,如警告消息所示。没有进行其他更改。
当完整的 NAMESPACE 文件为:
# Generated by roxygen2 (4.1.0.9001): do not edit by hand
importClassesFrom(sp,Spatial)
importClassesFrom(sp,SpatialLines)
importFrom(sp,SpatialLines)
测试3
但是,当我对DESCRIPTION 文件中的Imports 指令(即添加rgeos
. 这是从 test2 创建 test3 场景的唯一更改。
Imports:
methods,
sp,
rgeos
现在我收到一个警告,看起来像是来自 test1 的问题,即:
class "SpatialLinesNULL" is defined (with package slot ‘rgeos’) but no metadata object found to revise subclass information---not exported? Making a copy in package ‘minweSpatialNULL
据我所知,SpatialLinesNULL
是一个新的超类Spatial
,定义在rgeos
它可以提供一些通用函数和方法。
问题 2我假设无论我的第一条警告消息的原因是什么,这也是此类似消息的原因。
我在正确的轨道上吗?
测试4
在 test4 中,我尝试应用与 test2 中相同的解决方案,即将缺失的条目添加到 NAMESPACE 文件中。这是 test4 的完整 NAMESPACE 文件。
# Generated by roxygen2 (4.1.0.9001): do not edit by hand
importClassesFrom(rgeos,SpatialLinesNULL)
importClassesFrom(sp,Spatial)
importClassesFrom(sp,SpatialLines)
importFrom(sp,SpatialLines)
在哪个阶段我收到最后的错误消息:
d> devtools::document()
Updating minweSpatialNULL documentation
Loading minweSpatialNULL
Error: class "SpatialLinesNULL" is not exported by 'namespace:rgeos
在这个阶段我被卡住了。
问题 3来自 test3 的警告和随后的错误是我可以自己解决的吗(如果可以的话)?还是我需要向rgeos
软件包的维护者寻求帮助(例如要求他们导出SpatialLinesNULL
)?
session_info(来自 test4)
d> devtools::session_info()
Session info --------------------------------------------------------------------------
setting value
version R version 3.1.2 (2014-10-31)
system x86_64, mingw32
ui RStudio (0.98.953)
language (EN)
collate English_Australia.1252
tz Australia/Sydney
Packages ------------------------------------------------------------------------------
package * version date source
devtools * 1.7.0.9000 2015-02-20 local
lattice * 0.20-29 2014-04-04 CRAN (R 3.1.2)
minweSpatialNULL * 0.0.0.9000 <NA> local
Rcpp * 0.11.4 2015-01-24 CRAN (R 3.1.2)
rgeos * 0.3-8 2014-09-21 CRAN (R 3.1.2)
roxygen2 * 4.1.0.9001 2015-02-21 local
rstudio * 0.98.953 2014-08-02 local
rstudioapi * 0.2 2014-12-31 CRAN (R 3.1.2)
sp * 1.0-17 2015-01-08 CRAN (R 3.1.2)
stringr * 0.6.2 2012-12-06 CRAN (R 3.1.1)
d>
test4 的完整文件
R/myclasses.r
#------------------------------------------------------------------------------
#' MyClass1
#'
#' A subclass of SpatialLines
#'
#' MyClass1 is a subclass of sp::SpatialLines.
#' @importClassesFrom sp SpatialLines Spatial
#' @importFrom sp SpatialLines
#' @importClassesFrom rgeos SpatialLinesNULL
MyClass1 <- setClass('MyClass1', contains = c('SpatialLines'))
#------------------------------------------------------------------------------
#' MyClass2
#'
#' A subclass of MyClass1
#'
#' MyClass2 is a subclass of MyClass1 and a 2nd generation subclass of
#' sp::SpatialLines.
#' @importClassesFrom sp SpatialLines
MyClass2 <- setClass('MyClass2', contains = c('MyClass1'))
描述文件
Package: minweSpatialNULL
Title: Minimum Example of my Problem with SpatialLinesNULL
Version: 0.0.0.9000
Authors@R: person("Geoff", "Lee", , "geoff.lee@gmail.com", role = c("aut", "cre"))
Description: (Hopefully) demonstrates my problem with warnings
that I cannot seem to eradicate.
Depends: R (>= 3.1.2)
Imports:
methods,
sp,
rgeos
License: GPL (>= 2.0)
LazyData: true
命名空间文件
# Generated by roxygen2 (4.1.0.9001): do not edit by hand
importClassesFrom(rgeos,SpatialLinesNULL)
importClassesFrom(sp,Spatial)
importClassesFrom(sp,SpatialLines)
importFrom(sp,SpatialLines)
结论
非常感谢您提供的任何帮助、建议或指导!即使这只是关于我如何提出更好的问题:-)