r - 如何遍历目录以处理光栅文件而不使用 R 中的应用系列
问题描述
我在不同的文件夹中有光栅文件(.tif)(这些是我的模型)。我需要将它们导入单个对象并处理它们以创建一个数组(为此我将使用“abind”)。
我确实有大量模型,因此创建了一个巨大的数组数据集。我设法创建了一个用于一次读取和处理模型的函数。问题是,由于数据集的复杂性,在 for 循环中增长数组可能不是一个好主意,这可能会导致一些错误。
如何利用apply R的家庭功能为它构建一个功能?
这是我制作的功能
require(raster)
require(abind)
require(rgdal)
myFunction <- function (x)
{
directories <- list.dirs( x, full.names = TRUE)[-1]
e <- extent(xmin, xmax, ymin, ymax)
rcp <- NULL
for (i in 1:length(directories))
{
models_raw <- stack(list.files(directories[i],pattern = ".tif$", full.names = TRUE))
models_e <- crop( models_raw , e )
val <- values (models_e)
coord <- xyFromCell(models_e, 1:ncell(models_e))
models <- cbind(coord, val)
models <- na.omit(models)
rcp <- abind (rcp, models, along = 3)
}
return(rcp)
}
scenario <- myFunction( x = ".//data//models//")
解决方案
只需将您的处理概括为一个以目录为参数的已定义函数,所有这些都将使用lapply
. 最后使用 ado.call
来组合所有模型。不需要单独的对象。
model_process <- function(dir) {
model <- stack(list.files(dir, pattern = ".tif$", full.names = TRUE))
e <- extent(xmin, xmax, ymin, ymax)
model_e <- crop(model, e)
model_val <- getValues(model_e)
coord_model <- xyFromCell(model_e, 1:ncell(model_e))
model_final <- cbind(coord_model, model_val)
model_final <- na.omit(model_final)
return(model_final)
}
directories <- list.dirs(".//data//models//", full.names = TRUE)[-1]
model_list <- lapply(directories, model_process)
scenario <- do.call(abind, c(model_list, along=3))
# ALTERNATIVELY:
apn <- function(...) abind(..., along=3)
scenario <- do.call("apn", model_list)