我已经应用了一个函数来使用 terra 创建多层 SpatRaster。它已找到,但现在我想分离每个图层并在图层名称后命名新的 SpatRaster。对于三层来说还不错,但我稍后会考虑 15-100 层。我如何编写 for 循环或其他解决方案来自动执行此操作?
我在 R for 循环方面很糟糕,但我怀疑它们可以拯救我。
library(terra)
#create example layered raster
a <- rast(ncol = 10, nrow = 10)
values(a) <- rep(5,100)
names(a) <- "layer_one"
b <- rast(ncol = 10, nrow = 10)
values(b) <- rep(10,100)
names(b) <- "layer_two"
c <- rast(ncol = 10, nrow = 10)
values(c) <- rep(15,100)
names(c) <- "layer_three"
z <- c(a,b,c)
ids <- names(z)
在此示例中,我想要三个 SpatRaster,layer_one、layer_two、layer_ Three。
您可以循环使用
names()
并使用 assign()
将每个层存储在新对象中:
library(terra)
z <- c(a,b,c)
for(lyr in names(z)) assign(lyr, z[[lyr]])
# list layer_* objects
ls(pattern = "layer_.*")
#> [1] "layer_one" "layer_three" "layer_two"
layer_one
#> class : SpatRaster
#> dimensions : 10, 10, 1 (nrow, ncol, nlyr)
#> resolution : 36, 18 (x, y)
#> extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#> coord. ref. : lon/lat WGS 84
#> source(s) : memory
#> name : layer_one
#> min value : 5
#> max value : 5
只是一个想法,但拥有 SpatRasterDataset 或仅拥有 SpatRaster 列表听起来比在全局环境中拥有数十个 terra 对象更易于管理。
# a list:
rast_list <- split(z, 1:nlyr(z)) |> `names<-`(names(z))
str(rast_list)
#> List of 3
#> $ layer_one :S4 class 'SpatRaster' [package "terra"]
#> $ layer_two :S4 class 'SpatRaster' [package "terra"]
#> $ layer_three:S4 class 'SpatRaster' [package "terra"]
rast_list$layer_one
#> class : SpatRaster
#> dimensions : 10, 10, 1 (nrow, ncol, nlyr)
#> resolution : 36, 18 (x, y)
#> extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#> coord. ref. : lon/lat WGS 84
#> source(s) : memory
#> name : layer_one
#> min value : 5
#> max value : 5
# list to SpatRasterDataset:
rast_ds <- sds(rast_list)
rast_ds
#> class : SpatRasterDataset
#> subdatasets : 3
#> dimensions : 10, 10 (nrow, ncol)
#> nlyr : 1, 1, 1
#> resolution : 36, 18 (x, y)
#> extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#> coord. ref. : lon/lat WGS 84
#> source(s) : memory
#> names : layer_one, layer_two, layer_three
创建于 2023-08-19,使用 reprex v2.0.2