R光栅函数,从一个光栅中拆分多个光栅

R光栅函数,从一个光栅中拆分多个光栅,r,function,split,raster,R,Function,Split,Raster,我有一个简单的函数将光栅对象拆分为三个不同的类。但是,我的函数不返回这些光栅。我也读了这个教程 根据它的说法,这是“一种非常糟糕的做法”。然而,“正确的方法”似乎过于复杂。是否真的没有简单的方法可以做到这一点(即,考虑函数应该使事情变得更容易,而不是相反) 我对用R处理光栅很陌生,所以请原谅我的愚蠢问题 rm(list=ls(all=T)) r <- raster(ncol=10, nrow=10) r[] <- rnorm(100,100,5) # Create split f

我有一个简单的函数将光栅对象拆分为三个不同的类。但是,我的函数不返回这些光栅。我也读了这个教程 根据它的说法,这是“一种非常糟糕的做法”。然而,“正确的方法”似乎过于复杂。是否真的没有简单的方法可以做到这一点(即,考虑函数应该使事情变得更容易,而不是相反)

我对用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()
rm(list=ls(all=T))

r不要试图单独退回它们。而是
返回(列表(r1、r2、r3))
。但是请参见有关样式的注释。

R光栅
子集
函数在这里可以提供帮助。返回砖块后,可以将每个标注栏子集为单独的光栅

# split the raster - returns a three band stack
rasters = splitrast(r,c(0.2,0.8))

# subset each band of the stack as a separate raster
r1 = subset(rasters, 1)
r2 = subset(rasters, 2)
r3 = subset(rasters, 3)

# proof - plot the separate rasters - same as those plotted in the function
plot(r1);plot(r2);plot(r3)

您应该将r1、r2和r3存储在RasterStack中,并将此RasterStack作为函数的输出返回。或者至少返回一个包含三个
RasterLayer
s的列表。正如其他人所建议的,不要处理三个层,处理
brick()
stack()
(这两个函数非常相似,你几乎可以把它们看作是一个数组,你可以把光栅看作一个矩阵)。此外,更重要的是,你的函数返回什么(R函数的基础:你只需要得到r1;你可以
返回(列表(r1,r2,r3))
)?请提供一个可复制的示例。感谢您的想法,但仍然不起作用..顺便说一句。现在有人知道如何复制光栅n次吗?(函数中的第3行)。如果执行此操作,返回的对象似乎会变成“列表”类型,因此当您尝试访问每个元素时,它们似乎保留此类型,而我无法将其转换回“S4”类型。因此,应用(例如):“dim(列表中的光栅)”这应该返回光栅的行和列,如果您试图进一步挖掘对象,实际上会返回1或NULL。@Irene我在4.5年前发布了这个答案,所以我不太记得了。但是列表只是一个容器。请尝试索引它。例如
l=list()
然后
l[[1]]
。或者,
mat\u list=list(矩阵(rep(1,6),nrow=3),矩阵(rep(1,6),nrow=2))
然后
sappy(mat_list,dim)
dim(mat_list[[1]])
等。您只需深入到实际光栅,而不是在列表本身上使用
dim
,它返回列表的
dim
,而不是列表中光栅的
dim