从 R 中的嵌套循环中的列表中提取 3D netcdf 变量
Extracting 3D netcdf variable from lists within nested loop in R
假设我有 3 个不同站点的 n 时间步长的 10 个模型配置,总共生成了 30 个我想要打开和操作的 netcdf 文件。我可以打开
等30个文件
require(ncdf4)
allfiles= list()
nmod=10
nsites=3
for (i in 1:nmod) {
allfiles[[i]] = list(nc_open(paste0('Model',i,'siteA.nc')),
nc_open(paste0('Model',i,'siteB.nc')),
nc_open(paste0('Model',i,'siteC.nc')))
}
在查询打开内容的class时,我有
class(allfiles)
[1] "list"
class(allfiles[[1]][[1]])
[1] "ncdf4"
符合预期。
现在我想做的是从文件中的变量中提取值
var=list()
for (i in 1:nmod) {
for (j in 1:nsites) {
var[[i]][[j]] <- ncvar_get(allfiles[[i]][[j]],"var1")
nc_close(allfiles[[i]][[j]])
}}
但我收到此错误消息:
`Error in *tmp*[[i]] : subscript out of bounds`
如果我尝试
var[[i]] <- ncvar_get(allfiles[[i]][[j]],"var1")
它(可以理解)仅在一个站点生成包含 10 个模型配置的列表,即 var[[1]][[1]][1]
打印出模型配置 1、站点 A、时间步长 1 处的变量值,但 var[[1]][[2]]
不存在。
我如何在上面的循环中声明 var
以便它包含所有模型、所有站点和所有时间步长的所有值(例如 var[[1]][[2]][1]
存在)?
在你的错误发生的原始版本中,在第一个内循环中,你尝试做一些事情:var[[1]][[1]] <- something
,但是var[[1]]
不存在,R
也不存在不知道该怎么做,所以我想下面的事情应该可行,你在做 var[[i]][[j]] <- something
之前设置 var[i] <- list()
:
var=list()
for (i in 1:nmod) {
var[i] <- list()
for (j in 1:nsites) {
var[[i]][[j]] <- ncvar_get(allfiles[[i]][[j]],"var1")
nc_close(allfiles[[i]][[j]])
}
}
例如,如果您这样做:
var <- list()
for (i in 1:10) {
for (j in 1:10) {
var[[i]][[j]] <- 1
}
}
然后出现同样的错误。但是如果你在执行内部循环之前设置 var[[i]] <- list()
是这样的:
var <- list()
for (i in 1:10) {
var[[i]] <- list()
for (j in 1:10) {
var[[i]][[j]] <- 1
}
}
那么问题就解决了
假设我有 3 个不同站点的 n 时间步长的 10 个模型配置,总共生成了 30 个我想要打开和操作的 netcdf 文件。我可以打开
等30个文件require(ncdf4)
allfiles= list()
nmod=10
nsites=3
for (i in 1:nmod) {
allfiles[[i]] = list(nc_open(paste0('Model',i,'siteA.nc')),
nc_open(paste0('Model',i,'siteB.nc')),
nc_open(paste0('Model',i,'siteC.nc')))
}
在查询打开内容的class时,我有
class(allfiles)
[1] "list"
class(allfiles[[1]][[1]])
[1] "ncdf4"
符合预期。 现在我想做的是从文件中的变量中提取值
var=list()
for (i in 1:nmod) {
for (j in 1:nsites) {
var[[i]][[j]] <- ncvar_get(allfiles[[i]][[j]],"var1")
nc_close(allfiles[[i]][[j]])
}}
但我收到此错误消息:
`Error in *tmp*[[i]] : subscript out of bounds`
如果我尝试
var[[i]] <- ncvar_get(allfiles[[i]][[j]],"var1")
它(可以理解)仅在一个站点生成包含 10 个模型配置的列表,即 var[[1]][[1]][1]
打印出模型配置 1、站点 A、时间步长 1 处的变量值,但 var[[1]][[2]]
不存在。
我如何在上面的循环中声明 var
以便它包含所有模型、所有站点和所有时间步长的所有值(例如 var[[1]][[2]][1]
存在)?
在你的错误发生的原始版本中,在第一个内循环中,你尝试做一些事情:var[[1]][[1]] <- something
,但是var[[1]]
不存在,R
也不存在不知道该怎么做,所以我想下面的事情应该可行,你在做 var[[i]][[j]] <- something
之前设置 var[i] <- list()
:
var=list()
for (i in 1:nmod) {
var[i] <- list()
for (j in 1:nsites) {
var[[i]][[j]] <- ncvar_get(allfiles[[i]][[j]],"var1")
nc_close(allfiles[[i]][[j]])
}
}
例如,如果您这样做:
var <- list()
for (i in 1:10) {
for (j in 1:10) {
var[[i]][[j]] <- 1
}
}
然后出现同样的错误。但是如果你在执行内部循环之前设置 var[[i]] <- list()
是这样的:
var <- list()
for (i in 1:10) {
var[[i]] <- list()
for (j in 1:10) {
var[[i]][[j]] <- 1
}
}
那么问题就解决了