在 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)
}
我正在尝试创建 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)
}