【发布时间】:2015-06-24 12:36:25
【问题描述】:
我有一个简单的函数将栅格对象分成三个不同的类。但是我的函数不会返回这些栅格。我也读了这个教程http://cran.r-project.org/web/packages/raster/vignettes/functions.pdf 据它说,这是“这样做的一种非常糟糕的方式”。然而,“正确的方法”似乎过于复杂。真的没有简单的方法可以做到这一点(即,考虑函数应该让你更容易,反之亦然)。
我对使用 R 处理栅格很陌生,所以请原谅我的愚蠢问题..
rm(list=ls(all=T))
r <- raster(ncol=10, nrow=10)
r[] <- rnorm(100,100,5)
# Create split function // three classes
splitrast <- function(rast, quantile) {
print("Splitting raster...")
(q <- quantile(rast, probs=quantile))
r1 <- rast; r2 <- rast; r3 <- rast # copy raster three times
r1[rast > q[1]] <- NA #raster value less than .25 quantile
r2[rast <= q[1] | rast >= q[2]] <- NA #raster values is between quantiles
r3[rast < q[2]] <- NA #raster values is over .75 quantile
par(mfrow=c(1,3))
plot(r1);plot(r2);plot(r3)
rast <- brick(r1,r2,r3)
return(rast)
}
splitrast(r,c(0.2,0.8))
ls()
编辑:添加了可重现的示例
【问题讨论】:
-
您应该将 r1、r2 和 r3 存储在 RasterStack 中,并将此 RasterStack 作为函数的输出返回。
-
或者至少包含三个
RasterLayers 的列表。 -
正如其他人建议的那样,不要处理3层,处理
brick()或stack()(这两个非常相似,您几乎可以将它们视为一个数组,在某种程度上您可以将栅格视为矩阵)。此外,更重要的是,你的函数返回什么(R 函数的基础知识:你只会得到 r1;你可以return(list(r1,r2,r3)))?请提供一个可重现的例子。 -
感谢您的想法,但仍然无法正常工作.. 顺便说一句。现在有人如何复制光栅n次吗? (函数中的第 3 行)。