library(terra) library(raster) library(ncdf4) path1 <- dir('G:/ERA5hr/SVWL1/6/',pattern = '*.tif',full.names = T) wr <- raster("G:/ERA5hr/Fw/wr/wr.tif") a <- raster("G:/ERA5hr/Fw/a/a.tif") b <- raster("G:/ERA5hr/Fw/b/b.tif") for (i in 1:length(path1)){ print(path1[i]) w <- stack(path1[i]) #file2_data <- stack(path2[i]) if (w < wr) { file_data <- 1 } else { file_data <- sqrt(1+a*(w-wr)^b) } output_path <- paste('G:/ERA5hr/Fw/6/', substr(path1[i],19,32),'.tif',sep='') writeRaster(file_data,output_path, overwrite=TRUE,format = "GTiff") } 请优化上面代码
时间: 2024-03-15 09:43:53 浏览: 103
MODIS1B用户指南
以下是对上面代码的优化建议:
1. 首先,建议将库的导入放在代码的最开始,这样代码的可读性更好。
2. 在循环外部定义变量wr、a和b,这样可以避免每次循环都重新定义这些变量。
3. 使用raster::stack()将多个raster文件合并成一个raster对象,避免在循环中多次读取raster文件。
4. 使用ifelse()函数代替if-else语句,可以提高代码的效率和可读性。
5. 使用basename()函数代替手动截取文件名中的子字符串,可以提高代码的可读性和可维护性。
下面是优化后的代码:
```
library(terra)
library(raster)
library(ncdf4)
# 定义变量
path1 <- dir('G:/ERA5hr/SVWL1/6/', pattern = '*.tif', full.names = TRUE)
wr <- raster("G:/ERA5hr/Fw/wr/wr.tif")
a <- raster("G:/ERA5hr/Fw/a/a.tif")
b <- raster("G:/ERA5hr/Fw/b/b.tif")
# 循环处理每个文件
for (i in 1:length(path1)) {
print(path1[i])
# 读取raster文件
w <- raster::stack(path1[i])
# 计算结果
file_data <- ifelse(w < wr, 1, sqrt(1 + a * (w - wr)^b))
# 输出结果到文件
output_path <- file.path('G:/ERA5hr/Fw/6/', paste0(basename(path1[i]), '.tif'))
writeRaster(file_data, output_path, overwrite = TRUE, format = "GTiff")
}
```
阅读全文