从R

时间:2017-06-02 11:17:48

标签: r for-loop netcdf

假设我有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]是否存在)?

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
    }
}

然后问题就解决了。