【问题标题】:Automatically Create Objects from Files in a Directory从目录中的文件自动创建对象
【发布时间】:2017-06-28 17:53:48
【问题描述】:

我正在尝试在 R 脚本中自动化数据摄取过程,该脚本从定期更新的目录中提取数据。

一般框架遵循这个过程

library(sp)
library(rgdal)
library(raster)

f1.t1.cir <- stack("../raster/field1/f1_cir_t1.tif")
f1.t1.NDVI <- stack("../raster/field1/f1_ndvi_t1.tif")
f1.t1.RGB <- stack("../raster/field1/f1_ndvi_t1.tif")

f1.dat <- c(f1.t1.cir, f1.t1.NDVI, f1.t1.RGB)

for (i in f1.dat){
  plotRGB(i)
}

我想直接从目录中生成每个f1.t1.cir 类型的对象,这样当我添加一个新的TIFF 文件f1_cir_t2.tif 时,r 脚本将创建一个对象f1.cir.t2

我正在尝试使用类似的东西

a <- list.files(path= "../raster/field1", pattern = "\\.tif$")
b <- gsub("_", "\\.", a)

for (i in a) {
  assign(get(b[(which(a==i))]), stack((paste("../raster/field1/", i,sep=""))))
}

此时,我会将所有 tiff 文件作为堆叠的多波段栅格对象放在 R 工作区中。

我收到以下错误,

Error in get(b[(which(a == i))]) : object 'f1_t1_DSM.tif' not found

我不知道这是 get() 问题还是其他问题。

供参考

> a
[1] "f1_t1_DSM.tif"  "f1_t1_NDVI.tif"

> b
[1] "f1.t1.DSM.tif"  "f1.t1.NDVI.tif"

我想,这么多是有效的。

有什么建议吗?

【问题讨论】:

  • 忘记assignget;创建一个列表对象并将 cir、NDVI 和 RGB 对象放入该列表中。该列表可以命名,以便您可以通过编程方式引用每个列表。比随意地将它们倾倒在您的工作区中要好得多。
  • @joran,这听起来不错……你能举个例子吗?如何根据文件夹的内容创建对象列表? -thx

标签: r automation r-raster


【解决方案1】:

@joran,好建议...

f1.t1<-list()

for(i in list.files(path= "../raster/field1", pattern = "\\.tif$")){
  f1.t1[[i]]<-stack((paste("../raster/field1/", i, sep="")))
}

工作得很好,无需更改名称。

谢谢。

【讨论】:

  • 整个代码可以写成两行,简单得多:files = list.files('../raster/field1', pattern = '\\.tif$'); f1.t1 = lapply(paste0('../raster/field1/', files), stack)
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2018-04-07
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
相关资源
最近更新 更多