我有以下脚本将分析输出写入各个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)
答案 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 数组。