r - 如何在扩展S4类的R包中解决警告消息(未找到元数据对象;未导出SpatialLinesNULL类)

标签 r inheritance devtools sp r-package

这是我关于StackOverflow的第一个问题,所以请更正我犯的任何协议错误。但是,我已经从该站点上许多其他问题的答案中受益匪浅,因此,在继续之前,我要感谢为该站点做出贡献的社区。

总览

我在Windows 7机器上使用R,RStudio和程序包devtoolsroxygen2(问题末尾的完整session_info

我正在尝试编写自己的程序包,该程序包从程序包SpatialLines定义S4类sp的子类,并且还使用程序包rgeos。我的问题与当我使用devtools来document并无法完全解决并无法完全解决的警告消息有关
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'


我尝试过的东西以及剩下的问题

我已经在Google上搜索并搜索了几个网站,以寻找提示,但是我发现最接近的是2011年12月以来的一个简短主题,询问SpatialLinesNULL来自---
答案是rgeos
http://lists.r-forge.r-project.org/pipermail/rspatial-devel/2011-December/000033.html

我尝试尝试了解自己的问题所在,然后跨步
通过调试器中的代码,直到迷路为止,比我可以理解的要深得多
足以弄清楚应该发生什么。进行中
产生了一个小的(不是)实际的问题示例,如下所示。

我有3个问题。这里总结了它们,但实际上仅在下面的我的(不是)工作玩具示例的背景下才有意义:


问题1(在test1之后)为什么R无论如何都需要(虚拟的)超类Spatial,为什么仅当我在代码中定义了第二代MyClass2时?
需要说明的是,我曾经以为R打包名称空间机制将解决我真正使用过的类后对查找和访问前件/超类的任何需求。
问题2(在test3之后)我想我的第一个警告消息的原因是什么,也是类似消息的原因。
我在正确的轨道上吗?
问题3(在test4之后)是来自test3的警告吗?
后续错误我可以解决自己的问题(如果可以的话)?
还是我需要问@importClassesFrom软件包的维护者
寻求帮助(例如,要求他们导出rgeos)?


代码示例

我的玩具工作示例的r代码(仅删除了roxygen注释以保存
空格)是:

MyClass1 <- setClass('MyClass1', contains = c('SpatialLines'))
MyClass2 <- setClass('MyClass2', contains = c('MyClass1'))


MyClass2第二代子类似乎很重要(没有警告,它就会消失)。我不理解为什么。

我已经使用SpatialLinesNULL在此代码上进行了一系列测试
devtools。测试因NAMESPACE文件中的内容以及
在DESCRIPTION文件中的导入指令中。执行测试包括在RStudio中运行roxygen2(或沿其调用devtools::load_all()devtools::document())。发生的警告消息已在上面发布。我在每次测试之间的干净全局环境中重新启动R会话(警告仅在我第一次运行load_all()load_all时出现)。

在遵循下面给出的答案时,我意识到我还应该尝试从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)


尝试在计算机中运行document(或devtools::load_all()
重新启动的R会话会生成第一个警告(如上所示)。

问题1为什么R仍然需要~~(virtual?)~~超类devtools::document(),为什么仅当我在代码中定义了第二代Spatial时?需要说明的是,我曾经以为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

但是,当我对
描述文件中的Imports指令,即添加MyClass2。这是从test2创建test3场景的唯一更改。

Imports:
    methods,
    sp,
    rgeos


现在我得到一个警告,看起来像是来自test1,viz的问题:

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


据我所知,@importClassesFrom是一个新的
rgeos的超类,在SpatialLinesNULL中定义,因此它可以提供一些
通用功能和方法。

问题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的警告吗?
后续错误我可以解决自己的问题(如果可以的话)?
还是我需要问Spatial软件包的维护者
寻求帮助(例如,要求他们导出rgeos)?

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


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)


结论

在此先感谢您可以提供的任何帮助,建议或指导!即使这只是关于我可能会提出一个更好的问题的方式:-)

最佳答案

谢谢您提出这个广泛的问题。我有两个建议可以改善它。首先,提供一个可重现的示例,在这种情况下,它是一个最小的程序包,可让我们重现您的警告或错误消息。例如,

MyClass1 <- setClass('MyClass1', contains = c('SpatialLines'))
MyClass2 <- setClass('MyClass2', contains = c('MyClass1'))


在已加载sp的会话中工作正常,但是在打包代码中执行此操作时出现您所遇到的问题。创建这样的程序包意味着要做很多猜测工作:我们看不到完整的NAMESPACE,因此不知道导出的内容,并希望在加载程序包后在R会话中进行工作。第二:将您的问题与使用devtools引起的问题区分开来(即,使用构建和安装软件包的标准R软件包开发术语)。

根据您提供的信息,我只能回答:


问题1:Spatial不是虚拟类,它存在是因为它定义了所有派生类的共同点(CRS和边界框),并且因为有定义的方法可以对所有派生类进行操作,所以它是必需的类。 MyClass2需要它与您的包裹有关,我没有
问题2:我无法回答,因为您没有显示导致问题1的警告。另外,SpatialLinesNULL不是Spatial的超类,而是SpatialLines的超类,由

setClassUnion("SpatialLinesNULL", c("SpatialLines", "NULL"))
问题3:您可以尝试编译导出该类的rgeos的修改版本;如果您提供了一个很好的用例(可以重现您问题的最小软件包),则rgeos的开发人员之一将对此进行调查。

关于r - 如何在扩展S4类的R包中解决警告消息(未找到元数据对象;未导出SpatialLinesNULL类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28871632/

相关文章:

r - 在 ubuntu 16.04 中的 R 3.2.3 上安装 rgdal 时遇到问题

r - plm 中的滞后

java - 如何从子类而不是父类(super class)获取数据字段?

c# - 从继承接口(interface)显式设置内部属性 C#

flutter - Dart继承类并在父类的函数中使用

visual-studio-2012 - TFS - 搁置集 - 您无法取消搁置对 $/Business/Path/Logic 的更改,因为工作区中的此项目存在冲突

javascript - 如何通过 devtools(chrome、Edge 等)查看 JavaScript 使用的内存中具体有哪些变量?

r - ggplot 和 geom_sf 在世界地图上不显示刻度线和刻度线

r - 有没有办法使用 R 导出学术文章中的表格?

r - 如何压缩R程序包构建中的保存