发布代码错误但不在调试或源代码中

时间:2015-03-17 15:57:40

标签: r debugging package raster

我的代码运行正常但在包中失败

我把它煮到了

wtf<-function(r)
{
    require(raster)
    stopifnot(class(r) == "RasterLayer")
    return(as.matrix(r))
}

来源时,一切正常。当函数是包的一部分时,它会失败。它很好地在调试模式下运行,一步一步。

 library(mypackage)
 r <- raster(ncol=6, nrow=6)
 r[] <- runif(ncell(r),0,1)
 extent(r) <- matrix(c(0, 0, 6, 6), nrow=2)

 wtf(r)

 # Error in as.vector(data) :
 # no method for coercing this S4 class to a vector

 # Traceback
 # 5 as.vector(data)          
 # 4 array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x), 
 #    NULL) else NULL) 
 # 3 as.matrix.default(r) 
 # 2 as.matrix(r) at terrain.R#7
 # 1 wtf(s) 

我有点想知道为什么会这样,以及如何继续。 构建顺利,检查变得干净,所以发生了什么?

为了解决问题,下一个要问和探索的问题是什么?

 R version 3.1.1 (2014-07-10)
 Platform: x86_64-apple-darwin10.8.0 (64-bit)

 locale:
 [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

 attached base packages:
 [1] stats     graphics  grDevices utils     datasets  methods   base     

 other attached packages:
 [1] raster_2.3-0  spdep_0.5-77  Matrix_1.1-4  minerva_1.4.1 gdata_2.13.3 rgdal_0.9-1   sp_1.0-15    

 loaded via a namespace (and not attached):
 [1] boot_1.3-11     coda_0.16-1     deldir_0.1-5    grid_3.1.1      gtools_3.4.1  lattice_0.20-29 LearnBayes_2.15 MASS_7.3-33     nlme_3.1-118    parallel_3.1.1  splines_3.1.1   tools_3.1.1 

1 个答案:

答案 0 :(得分:1)

回溯显示使用默认的as.matrix,而不是栅格变体。如果您将此行添加到Namespace文件中,我相信这个问题就会消失:

import(raster)

或者当您明确指出哪个as.matrix时:

wtf <- function(r) {
    stopifnot(inherits(r, "RasterLayer"))
    raster::as.matrix(r)
}

您可以考虑使用更正式的(S4)方法,而不是“手动”测试类成员资格:

if (!isGeneric("wtf")) {
    setGeneric("wtf", function(x, ...)
        standardGeneric("wtf"))
}   

setMethod("wtf", signature(x='RasterLayer'), 
    function(x, ...)  {
        raster::as.matrix(x)
    }
)