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

release code error but not in debug or on source

我的代码运行良好但在包中失败

我把它归结为

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 

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

import(raster)

或者当您明确表示想要 as.matrix 时:

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

与 'manually' 测试 class 成员资格相比,您可以考虑更正式的 (S4) 方法:

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

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