假设我有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')))
}
在查询打开的类时,我有
类(allfiles)
[1]“list”
类(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]
是否存在)?
答案 0 :(得分:1)
在发生错误的原始版本中,在第一个内部循环中,您尝试执行某些操作:var[[1]][[1]] <- something
,但var[[1]]
不存在,而R
不会#39;知道该怎么做,所以我猜以下事情应该有效,你在var[i] <- list()
之前设置var[[i]][[j]] <- something
:
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
}
}
然后问题就解决了。