10

我需要创建几个光栅马赛克。我在 64 位 Windows 计算机上使用 Package raster 版本 2.0-31。我相信我做功课检查了所有可能的博客并向一些同事提出了这个问题,但仍然找不到解决方案。

我遇到的问题是,如果我的网格列在栅格对象中,我将无法创建马赛克。我发现这个例子虽然我可以应用,但不是,我收到一条奇怪的错误消息。下面的例子代表了我的问题:

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)

这是我得到的错误:

函数错误(类、fdef、mtable):无法为签名“列表”、“缺失”的函数“马赛克”找到继承的方法</p>

我也尝试了这里建议的功能,但也没有用。

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)

这是错误消息:

raster(union(rasters1)) 中的错误:在为函数“raster”选择方法时评估参数“x”时出错:as.vector(y) 中的错误:缺少参数“y”,没有默认值

4

1 回答 1

16

这似乎是较新版本的栅格中的回归。您的示例代码在 raster 1.9-70(和 R 2.13.1)中按预期运行,但给出的错误与您在 raster 2.0-41(ad R 2.15.3)中收到的错误相同。您可能希望通过电子邮件向维护者 Robert J. Hijmans 指出这一点。

与此同时,这个问题可以得到解决。查看raster 1.9-70中的镶嵌和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)
})
于 2013-03-09T03:26:27.857 回答