根据输入的文件名在R中自动保存和命名文件。

问题描述 投票:0回答:1

我已经用AdehabitatHR生成了几个利用分布图(UD),并将它们存储为Geotiffs。我现在用同样的UDs和Lattice软件包生成一些地图,并将它们保存为LZW压缩的高分辨率tiff图像。问题是,我有数百张地图要制作、保存和命名。一旦我从一个目录中加载了所有必要的文件,是否有办法自动做到这一点?我的每一个UD都有以下结构的文件名 "UD_resolution_species_area_year_season.tif",在最后的名称,我给我的地图,我想保持相同的结构(或整个文件名),但添加前缀 "blablabla_",如 "blablabla_UD_resolution_species_area_year_season.tiff"。图片还包括一个主名,一个大写字母,也要改。

此刻我用的是下面的。

rlist = list.files(getwd(), pattern = "tif$", full.names = FALSE)
for (i in rlist) {
  assign(unlist(strsplit(i, "[.]"))[1], raster(i))
}

 shplist = list.files(getwd(), pattern = "shp$", full.names = FALSE)
for (i in shplist) {
  assign(unlist(strsplit(i, "[.]"))[1], readOGR(i))
}

UD <- 'UD_resolution_species_area_year_season'
    ext <- extent(UD) + 0.3 # set the extent for the plot

    aa <-
      quantile(UD,
               probs = c(0.25, 0.75),
               type = 8,
               names = TRUE)
    my.at <- c(aa[1], aa[2])
    my.at <- round(my.at, 3)

    maxval <- maxValue(UD)

tiff(
  "C:/myworkingdirectory/maps/blablabla_UD_resolution_species_area_year_season.tiff",
  res = 600,
  compression = "lzw",
  width = 15,
  height = 15,
  units = "cm"
)

levelplot(
  UD,
  xlab = "",
  ylab = "",
  xlim = c(ext[1], ext[2]),
  ylim = c(ext[3], ext[4]),
  margin = FALSE,
  contour = FALSE,
  col.regions = viridis(1000),
  colorkey = list(at = seq(0, maxval)),
  main = "A",
  maxpixels = 2e5
) + latticeExtra::layer(sp.polygons(Land, fill = "grey50", col = NA)) + contourplot(
  `UD`,
  at = my.at[1],
  labels = FALSE,
  margin = FALSE,
  lty = 2,
  col = "orange",
  pretty = TRUE
) + contourplot(
  UD,
  at = my.at[2],
  labels = FALSE,
  margin = FALSE,
  lty = 2,
  col = "red",
  pretty = TRUE,
)

dev.off()
r plot lattice levelplot
1个回答
0
投票

这是一个常见的初学者错误,使用 assign. 做 使用它,就会产生你现在所面临的那种麻烦。相反,你可以制作列表或者使用循环。

另外,你问的是基本的 R 东西,但你增加了很多关于设置范围和 levelplot 的无关细节,使问题复杂化了。学习做这些基本的东西,最好是先去掉杂乱无章的东西,集中精力做一个简单的案例。这也是你应该在这个论坛上写问题的方式。

实质上你有一堆文件要处理。下面我演示了如何在名字的向量上循环,然后循环,在循环中做你需要做的事情。

library(raster)
rastfiles <- list.files(pattern = "tif$", full.names=TRUE)
outputfiles <- file.path("output/path", paste0("prefix_", basename(rastfiles)))
for (i in 1:length(rastfiles))    
   r <- raster(rastfiles[i])
   png(outputfiles[i])
   plot(r)
   dev.off()
 }

你也可以先把所有的文件读到一个列表中去。

rastfiles <- list.files(pattern = "tif$", full.names=TRUE)
rlist <- lapply(rastfiles, raster)
names(rlist) <- gsub(".tif$", "", basename(rastfiles))

rastfiles <- list.files(pattern = "shp$", full.names=TRUE)
slist <- lapply(shpfiles, readOGR)
names(slist) <- gsub(".shp$", "", basename(shpfiles))

也许还可以创建一个输出文件名的向量。

outputtif <- file.path("output/dir", basename(rastfiles))   

然后在列表中的项目或输出文件名上循环。

© www.soinside.com 2019 - 2024. All rights reserved.