簡體   English   中英

從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')))
}

當查詢打開什么的類時,我有

類(所有文件)

[1]“清單”

類(所有文件[[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
    }
}

然后問題就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM