Принудительная «плавание» точности для координатной переменной неограниченной размерной переменной (времени) в netcdf с использованием R (ncdf4) - PullRequest
0 голосов
/ 07 февраля 2019

Команда ncdim_def из пакета ncdf4 создана для поощрения автоматического создания координатной переменной, которая соответствует измерению, что является очень хорошей практикой.

Однако она позволяет создавать только "двойной""или" целочисленная "точность для этой координатной переменной.По внешним причинам мне нужно написать переменную координаты «время» в виде числа с плавающей запятой.

Для этого я использую следующую структуру, которая состоит в создании переменной координаты отдельно от определения измерения (т. Е. С использованием параметраcreate_dimvar = FALSE описано в документе ncdim_def)

timevalue= seq(0.5,10.5)
VAR1value= seq(10.2,20.2)

# define time dim, but without the time var
timedim <- ncdim_def( name   = 'time'  ,
                  units  = '', 
                  vals   = seq(length(timevalue)),
                  unlim  = TRUE,
                  create_dimvar = FALSE)

# define time coordinate variable  
timevar <- ncvar_def(name  = 'time',
                 units = 'days since 1950-01-01 00:00:00',
                 dim = list(timedim), 
                 longname = 'time', 
                 prec = "float")

# define another variable
var1var<- ncvar_def(name = 'VAR1',
                units    = 'unit1',
                dim      = list(timedim),
                missval  = -9999.0, 
                longname = 'VAR1 long name')

defVar<-list(timevar,var1var)

# creating ncfile (removing any previous one for repeated attempt)
ncfname='test.nc'
if (file.exists(ncfname)) file.remove(ncfname)
ncout   <- nc_create(ncfname,defVar,force_v4=T, verbose = T)

# writing the values
ncvar_put(ncout,timevar,timevalue)
ncvar_put(ncout,var1var,VAR1value)

nc_close(ncout)

Однако это возвращает ошибку:

"ncvar_put: warning: you asked to write 0 values, but the passed data array has 11 entries!"

Действительно, в результате netcdf показывает (ncdump):

dimensions:
    time = UNLIMITED ; // (0 currently)
variables:
    float time(time) ;
        time:units = "days since 1950-01-01 00:00:00" ;
    float VAR1(time) ;
        VAR1:units = "unit1" ;
        VAR1:_FillValue = -9999.f ;
        VAR1:long_name = "VAR1 long name" ;

Полагаю, мне нужно навязать измерение неограниченного «временного» измерения при создании, но я не понимаю, как это сделать в рамках ncdf4.

...