在 R 中以不同名称保存在循环中生成的光栅名称

Save names of raster produced in loop with different names in R

我正在尝试创建 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)。我以为我会有五个光栅文件名称 raster1、raster2.....raster5。谁能帮我看看我的代码有什么问题吗?

谢谢

这是一道非常基础的 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)
}               

R 没有自动字符串插值。如果要将 i 的值放入 filename 字符串中,则需要显式替换它。试试这个:

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

此代码使用 gsub 函数将传递的字符串中的标记 "INDEX" 替换为 i 的值,并 returns 修改后的字符串。

您也可以使用 paste

构造文件名
 filename <- paste("raster_", i, ".tif", sep="")

为提供的答案添加一点内容,因为了解如何将目录路径包含到文件命名过程中也很有用。如果栅格是堆叠的,您可以使用 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)
   }