我需要创建几个栅格马赛克。我在64位Windows计算机上使用Package光栅版2.0-31。我相信我的作业通过所有可能的博客进行检查并向一些同事提问,但仍无法找到解决方案。
我遇到的问题是,如果我的网格列在栅格对象中,则无法创建马赛克。我找到了this example,虽然我可以申请,但不是,我得到一个奇怪的错误信息。以下示例代表我的问题:
r <- raster()
r1 <- crop(r, extent(-10, 10, -10, 10))
r2 <- crop(r, extent(0, 20, 0, 20))
r3 <- crop(r, extent(10, 30, 10, 30))
r1[] <- 1:ncell(r1)
r2[] <- 1:ncell(r2)
r3[] <- 1:ncell(r3)
rasters1 <- list(r1, r2, r3)
mos <- mosaic(rasters1,fun=mean)
这是我得到的错误:
Error in function (classes, fdef, mtable) :
unable to find an inherited method for function ‘mosaic’ for signature ‘"list", "missing"’
我也尝试了here中建议的功能,但也没有用。
fmerge <- function(rasters1, fun, ...){
ex <- raster(union(rasters1))
res(ex) <- res(rasters1[[1]])
for( i in 1:length(rasters1) )
rasters[[i]] <- merge(rasters1[[i]], ex)
rasters <- stack(rasters1)
fun(rasters1, ...)
}
rfm <- fmerge(rasters1, mean, na.rm=T)
这是错误消息:
Error in raster(union(rasters1)) :
error in evaluating the argument 'x' in selecting a method for function 'raster': Error in as.vector(y) : argument "y" is missing, with no default
答案 0 :(得分:12)
这似乎是较新版本栅格的回归。您的示例代码在栅格1.9-70(以及R 2.13.1)中按预期运行,但提供的错误与您在栅格2.0-41(ad R 2.15.3)中收到的错误相同。您可以通过电子邮件向维护人员Robert J. Hijmans发送电子邮件来指出这一点。
与此同时,这个问题可以解决。查看mosaic in raster 1.9-70和mosaic in raster 2.0-41之间的代码差异,您可以看到已删除接受列表的方法。相反,现在只有一种接受单个栅格的方法。所以,如果你有很多栅格,你应该像这样调用函数:
mos1 <- mosaic(r1, r2, r3, fun=mean)
但是,如果要构建动态镶嵌的栅格列表,这不是很方便。在这种情况下,R确实有一个辅助函数来帮助你do.call
。 do.call
所做的是获取函数和列表,并使用列表中的项作为参数调用该函数。因此,只要将fun=mean
添加到参数列表中,就可以使用它:
rasters1.mosaicargs <- rasters1
rasters1.mosaicargs$fun <- mean
mos2 <- do.call(mosaic, rasters1.mosaicargs)
您可以仔细检查这两种方法是否给出相同的结果:
stopifnot(identical(mos1, mos2))
这可以包含在一个简单的便利函数中,并绑定到相关的调用签名,因此您的原始代码将不加修改地工作:
setMethod('mosaic', signature(x='list', y='missing'),
function(x, y, fun, tolerance=0.05, filename=""){
stopifnot(missing(y))
args <- x
if (!missing(fun)) args$fun <- fun
if (!missing(tolerance)) args$tolerance<- tolerance
if (!missing(filename)) args$filename<- filename
do.call(mosaic, args)
})