无法循环从分析创建多个NCDF4文件

时间:2017-04-18 16:41:59

标签: r

我有以下脚本将分析输出写入各个NCDF4文件。脚本正在写第一个文件并停止。 我得到的错误是: -

R_nc4_create出错:权限被拒绝(创建模式为4096) nc_create中的错误(ncfname,list(tmp_def,tmp_def2),force_v4 = T):   nc_create中出错!

似乎出现了问题: -

ncfname<- sprintf('%sA.nc', Listbreak3)

我无法弄清楚。

我的脚本是更大分析的一部分。但是利益的一部分在下面。

它可能是循环,但我认为循环没问题

希望有人写过多个NCDF4文件

写NCDF4文件 #
  tunits<-"days since 1800-01-01 00:00:00"

  #Define dimensions
  ##################################################################
  londim<-ncdim_def("Lon","degrees_east",as.double(Lon))
  latdim<-ncdim_def("Lat", "degrees_north",as.double(Lat))
  timedim<-ncdim_def("timeset",tunits,as.double(timeset))

  #Define variables
  ##################################################################
  fillvalue<-NA

  dlname<-"2 meter air temperature"
  dlname2<-" 2 meter max air temperature"

  tmp_def<-ncvar_def("Y2ts_Stripped","deg_C",
  list(londim,latdim,timedim),fillvalue,dlname,prec = "double")
  tmp_def2<-ncvar_def("X2ts_Stripped","deg_C", 
  list(londim,latdim,timedim),fillvalue,dlname2,prec = "double")

  ncatt_put(ncout,"Lon","axis","X")
  ncatt_put(ncout, "Lat", "axis", "Y")
  ncatt_put(ncout, "timeset","axis", "T")

  #################################################
  title<-c( 1:2 )
  names(title)<-c("jack","jill")
  title<-as.data.frame(title)
  ###############################################  
   Listbreak<-filelist


   #Create Ncdf4 file and  put arrays 
   ##################################################################
   for (i in 1:length( Listbreak)){
   Listbreak2<-do.call(rbind, strsplit(Listbreak, "[[:punct:]]|\\s")) 
   [,c(1, 2,3)]###Breaking up the file name
   Listbreak3<-Listbreak2[,2]


    ncfname<- sprintf('%sA.nc', Listbreak3)

    ncout<-nc_create(ncfname,list(tmp_def,tmp_def2),force_v4=T) 

    ncvar_put(ncout,tmp_def,Y2ts_Stripped,start=NA,count = NA )

    ncvar_put(ncout,tmp_def2,X2ts_stripped, start= NA,count = NA )

    } 

    # attributes # the 0 designates the attribute as global 
    ###########################################################
    ncatt_put(ncout,0,"Make_NCDF4_File",1, prec="int")
    ncatt_put(ncout,0,"Maynooth_University",1,prec="short")
    ncatt_put(ncout,0,"AR000087828",1, prec="short")
    ncatt_put(ncout,0,"description","this is the script to write NCDF4 
    files")


    #Close file and write date to disk
    ##########################################################
    nc_close(ncout)

3 个答案:

答案 0 :(得分:1)

很不幸,我无法使您的代码正常工作,因此,如果将来有人在创建多个NetCDF文件时遇到问题,下面是一个模拟示例代码,下面循环3个矩阵以输出3个唯一的.nc文件。

此外,每当出现“ 4096”错误时,我都发现我没有执行nc_close,并且一旦抛出错误,我就必须重新启动R。

#--- Set up Data 
library(ncdf4)

t1 <- c(1,2,3,4,5) ; 
t2 <- c(1,2,3,4,5,6,7,8,9,10) ; 
t3 <- rev(t2) ;   
time = list(t1,t2,t3)

h1 <- c(-2.1,-2.0,-2.2,-1.99,-2.3) ; 
h2 <- c(-2.1,-2.0,-2.2,-1.9,-2.3,-1.8,-2.4,-1.7,-2.5,-1.6) ; 
h3 <- rev(h2) ;  
height = list(h1,h2,h3)

rm(t1,t2,t3,h1,h2,h3)

#--- Define Dimensions 
dimX <- lapply(time,function(x)ncdim_def( "X", "time", x ))

#--- Define variables
var1d <- lapply(dimX,function(x)ncvar_def("height", "units", x, missval = NaN))

#--- Create the test file
doc_name = list('Case1', 'Case2','Case3')

for (i in 1:length(doc_name)){ 
  ncfname <- paste0(doc_name,'_test.nc') 
  ncout<-nc_create(ncfname[i],var1d[[i]],force_v4=T) 
  ncvar_put(ncout,var1d[[i]],height[[i]])
  nc_close(ncout)
} ;

答案 1 :(得分:0)

循环错误

Listbreak&LT; -filelist   Listbreak2&lt; -do.call(rbind,strsplit(Listbreak,“[[:punct:]] | \ s”))[,c(1,2,3)] ###分解文件名   Listbreak3&LT; -Listbreak2 [2]

N < - 长度(Listbreak)

for(i in 1:N){

ncfname<- paste0(substr(Listbreak[i],1,16),'a.nc')

答案 2 :(得分:-1)

当您使用 nc_create 函数时,删除部分 force_v4=T

ncout <- nc_create(ncfname, var1d)

并且数据本身 var1d 应该是一个 3-D 数组。