在R中循环产生的栅格图层,以不同的名称保存。

3

我正在尝试创建5个栅格文件,并将每个栅格文件写入单独的文件名中。到目前为止,我已经成功实现了这一点:

c=5
for (i in 1:c){
z<-RFsimulate(x=x,y=y,grid=TRUE,model = model,maxGB=4.0)
a<-raster(z)
projection(a) <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"
writeRaster(raster(a),filename="raster[i].tif")
} 

但是我在我的工作目录中只发现了一个栅格文件(栅格1)。 我原以为会有五个栅格文件名称为栅格1,栅格2 .....栅格5。 有人能帮我解决一下代码存在的问题吗?

谢谢

3个回答

5

这是一个非常基础的R语言问题。您可能需要通过简单的循环进行练习。使用print语句查看正在发生的事情。请注意,您创建了对象a,但没有使用它。 "raster[i].tif"是一个字符串,与迭代器i无关。以下是解决方案:

n <- 5
for (i in 1:n){
    z <- RFsimulate(x=x,y=y,grid=TRUE,model = model,maxGB=4.0)
    a <- raster(z, crs="+proj=longlat +datum=WGS84")
    f <- paste0('raster', i, '.tif')
    writeRaster(a, filename=f)
}               

3

R语言不支持自动字符串插值。如果你想把变量i的值放入字符串filename中,你需要显式地进行替换。可以尝试以下方法:

   ...
   projection(a) <- ...
   filename <- gsub("INDEX", i, "raster_INDEX.tif")
   writeRaster(raster(z), filename=filename
}

这段代码使用gsub函数将传入字符串中的标记"INDEX"替换为i的值,并返回修改后的字符串。
你也可以使用paste构建文件名。
 filename <- paste("raster_", i, ".tif", sep="")

0

针对已有的答案,再补充一点内容,因为知道如何将目录路径包含在文件命名过程中也很有用。如果栅格图像是堆叠的,你可以使用 basename() 保留原始名称:

##Set the lists
list_dirs <- list.dirs(getwd(), recursive = FALSE)
stack.list <- list()

##Loop the rasters into a stack
for (i in 1:length(list_dirs)){

    rasters <- list.files(path=list_dirs[i], pattern = ".tif$", recursive=FALSE, ignore.case = TRUE, full.names = TRUE)
    stack.list[[basename(list_dirs)[i]]] <- stack(rasters)

    ##Useful to shorten the names of the raster bands (e.g., Sentinel-2)
    stack.list2[[basename(list_dirs)[i]]] <- setNames(
           stack.list[[basename(list_dirs)[i]]],
           c("B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B11", "B12", "B8A")
           )  

    writeRaster(stack.list, filename = file.path("C:/Your Directory", paste0(basename(list_dirs)[i], i, "_stack")), overwrite=TRUE)
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接