[R-sig-Geo] raster - 4D Bricks

Robert J. Hijmans r.hijmans at gmail.com
Wed Sep 3 20:07:14 CEST 2014


Mark and Mike,
Thanks for reporting and clarifying. Fixed, I think, in raster version 2.2-45.
Robert

On Wed, Jul 30, 2014 at 1:13 AM, Michael Sumner <mdsumner at gmail.com> wrote:
> Hello,
>
> Thanks for clarifying, I get that problem too.  If I get a chance I'll
> have a closer look, but otherwise here's my notes for now.
>
> Note that conversion to stack allows it to work:
> library(raster)
> Loading required package: sp
> b <- brick('http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/godas/pottmp.2013.nc',
> lvar=3, level=1, varname='pottmp')
> dropLayer(stack(b), 1:2)
>
> I presume you are getting this url read via the ncdf4 package? (And
> not via the GDAL DODS driver, for example).
>
> I get the same problem with subset() where i is longer than 1
> (dropLayer is a wrapper around subset). Below is my subset traceback
> and session info.
>
> Cheers, Mike.
>
> subset(x, 1:2)
> Error in (function (classes, fdef, mtable)  :
>   unable to find an inherited method for function ‘extent’ for
> signature ‘"character"’
> In addition: Warning message:
> In .stackCDF(x, varname = varname, bands = bands) :
>   pottmp has 4 dimensions, I am using the last one
>> traceback()
> 8: stop(gettextf("unable to find an inherited method for function %s
> for signature %s",
>        sQuote(fdef at generic), sQuote(cnames)), domain = NA)
> 7: (function (classes, fdef, mtable)
>    {
>        methods <- .findInheritedMethods(classes, fdef, mtable)
>        if (length(methods) == 1L)
>            return(methods[[1L]])
>        else if (length(methods) == 0L) {
>            cnames <- paste0("\"", sapply(classes, as.character),
>                "\"", collapse = ", ")
>            stop(gettextf("unable to find an inherited method for
> function %s for signature %s",
>                sQuote(fdef at generic), sQuote(cnames)), domain = NA)
>        }
>        else stop("Internal error in finding inherited methods; didn't
> return a unique method",
>            domain = NA)
>    })(list("character"), function (x, ...)
>    standardGeneric("extent"), <environment>)
> 6: extent(x)
> 5: setExtent(x, value)
> 4: `extent<-`(`*tmp*`, value = <S4 object of class "Extent">)
> 3: .local(x, ...)
> 2: subset(x, 1:2)
> 1: subset(x, 1:2)
>
> sessionInfo()
> R version 3.1.0 (2014-04-10)
> Platform: x86_64-redhat-linux-gnu (64-bit)
>
> locale:
> [1] C
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
>
> other attached packages:
> [1] ncdf4_1.12    raster_2.2-31 sp_1.0-15
>
> loaded via a namespace (and not attached):
> [1] grid_3.1.0      lattice_0.20-29 tools_3.1.0
>
>
>
>
>
>
> On Wed, Jul 30, 2014 at 5:45 PM, Mark Payne <markpayneatwork at gmail.com> wrote:
>> No, apparently it is still a brick:
>>
>>> class(b)
>> [1] "RasterBrick"
>> attr(,"package")
>> [1] "raster"
>>
>>
>> Here is a minimum (not)-working example, based on this post, which seems to
>> be having similar problems:
>> http://r-sig-geo.2731867.n2.nabble.com/Subset-a-Raster-object-read-from-a-4D-NetCDF-file-td7586200.html
>>
>> Example follows:
>>> library(raster)
>> Loading required package: sp
>>> b <-
>>> brick('http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/godas/pottmp.2013.nc',
>>> lvar=3, level=1, varname='pottmp')
>>> b
>> class       : RasterBrick
>> dimensions  : 418, 360, 150480, 12  (nrow, ncol, ncell, nlayers)
>> resolution  : 1, 0.3333309  (x, y)
>> extent      : 0, 360, -74.66667, 64.66567  (xmin, xmax, ymin, ymax)
>> coord. ref. : +proj=longlat +datum=WGS84
>> data source :
>> http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/godas/pottmp.2013.nc
>> names       : X2013.01.01, X2013.02.01, X2013.03.01, X2013.04.01,
>> X2013.05.01, X2013.06.01, X2013.07.01, X2013.08.01, X2013.09.01,
>> X2013.10.01, X2013.11.01, X2013.12.01
>> Date        : 2013-01-01, 2013-02-01, 2013-03-01, 2013-04-01, 2013-05-01,
>> 2013-06-01, 2013-07-01, 2013-08-01, 2013-09-01, 2013-10-01, 2013-11-01,
>> 2013-12-01
>> varname     : pottmp
>> level       : 1
>>
>>> dropLayer(b,1)
>>
>> Error in (function (classes, fdef, mtable)  :
>>   unable to find an inherited method for function ‘extent’ for signature
>> ‘"character"’
>> In addition: Warning message:
>> In .stackCDF(x, varname = varname, bands = bands) :
>>   pottmp has 4 dimensions, I am using the last one
>>>
>>
>>
>>
>> On 29 July 2014 13:24, Michael Sumner <mdsumner at gmail.com> wrote:
>>>
>>> Are you sure that your "b" is still really a RasterBrick? That message
>>> comes if you give the functions character:
>>>
>>> library(raster)
>>> dropLayer("sometext", 1)
>>> Error in (function (classes, fdef, mtable)  :
>>>   unable to find an inherited method for function ‘dropLayer’ for
>>> signature ‘"character"’
>>>
>>> (Basically because the functions are all generics, they scans through
>>> available methods and tells you it can't find one for "character").
>>>
>>> It works for me, see contrived example below that I had on hand due to
>>> obscure testing many years ago.
>>> (There is warning related to subsetting a linked-4D file, but that
>>> seems harmless).
>>>
>>> But, also try selecting only the bands you want at read time (or even
>>> just use a stack), so
>>>
>>> b <- brick("/blah/blah/ncep_07c_tho_all_1948-2010.mon.nc", level = 3,
>>> band = 1:5)
>>>
>>> Cheers, Mike.
>>>
>>> ## create a 4D NetCDF file in R
>>> ## load NetCDF package
>>> library(RNetCDF)
>>> ## generate 4D data - 1:N
>>> dims <- c(2, 3, 2, 2)
>>> a <- array(data = 1:prod(dims), dim = dims)
>>>
>>> ## create NetCDF file
>>> nc <- create.nc("test-1.nc")
>>> ## coordinate values for NetCDF (to test transform and band metadata)
>>> x <- seq(0, 5, length = dim(a)[1])
>>> y <- seq(0, 2, length = dim(a)[2])
>>> c3 <- seq(0, 1, length = dim(a)[3])
>>> c4 <- seq(0, 1, length = dim(a)[4])
>>>
>>> ## dimensions
>>> dim.def.nc(nc, "x", length(x))
>>> dim.def.nc(nc, "y", length(y))
>>> dim.def.nc(nc, "c3", length(c3))
>>> dim.def.nc(nc, "c4", length(c4))
>>>
>>> ## variables
>>> var.def.nc(nc, "a", "NC_DOUBLE", c(0, 1, 2, 3))
>>> var.def.nc(nc, "x", "NC_DOUBLE", 0)
>>> var.def.nc(nc, "y", "NC_DOUBLE", 1)
>>> var.def.nc(nc, "c3", "NC_DOUBLE", 2)
>>> var.def.nc(nc, "c4", "NC_DOUBLE", 3)
>>> ## write the data (all at once, no start/count)
>>> var.put.nc(nc, "a", a)
>>> var.put.nc(nc, "x", x)
>>> var.put.nc(nc, "y", y)
>>> var.put.nc(nc, "c3", c3)
>>> var.put.nc(nc, "c4", c4)
>>> ## finish up
>>> close.nc(nc)
>>>
>>> library(raster)
>>> b <- brick("test-1.nc", level = 2)
>>> nlevels(b)
>>> dropLayer(b, 1)
>>> class       : RasterLayer
>>> band        : 2  (of  2  bands)
>>> dimensions  : 3, 2, 6  (nrow, ncol, ncell)
>>> resolution  : 5, 1  (x, y)
>>> extent      : -2.5, 7.5, -0.5, 2.5  (xmin, xmax, ymin, ymax)
>>> coord. ref. : NA
>>> data source : C:\temp\test-1.nc
>>> names       : X1
>>> z-value     : 1
>>> zvar        : a
>>> level       : 1
>>>
>>> Warning message:
>>> In .rasterObjectFromCDF(x, type = objecttype, band = band, ...) :
>>>   "level" set to 1 (there are 2 levels)
>>>
>>>
>>> On Tue, Jul 29, 2014 at 7:43 PM, Mark Payne <markpayneatwork at gmail.com>
>>> wrote:
>>> > Hi,
>>> >
>>> > I have a 4D climate model output that I am trying to work with via
>>> > raster,
>>> > and that is unfortunately giving problems. I create the object as a
>>> > brick:
>>> >
>>> >> b
>>> > class       : RasterBrick
>>> > dimensions  : 220, 254, 55880, 756  (nrow, ncol, ncell, nlayers)
>>> > resolution  : 1, 1  (x, y)
>>> > extent      : 0.5, 254.5, 0.5, 220.5  (xmin, xmax, ymin, ymax)
>>> > coord. ref. : +proj=longlat +datum=WGS84
>>> > data source : /home/mpayne/Documents/NACLIM/
>>> > ncep_07c_tho_all_1948-2010.mon.nc
>>> > names       : X19480131, X19480229, X19480331, X19480430, X19480531,
>>> > X19480630, X19480731, X19480831, X19480930, X19481031, X19481130,
>>> > X19481231, X19490131, X19490228, X19490331, ...
>>> > z-value     : 19480131, 20101231 (min, max)
>>> > varname     : var2
>>> > level       : 3
>>> >
>>> > But I would like to drop a lot of the layers, so I try:
>>> >
>>> >> dropLayer(b,1:5)
>>> > Error in (function (classes, fdef, mtable)  :
>>> >   unable to find an inherited method for function ‘extent’ for signature
>>> > ‘"character"’
>>> >>
>>> >
>>> > And get a rather strange error.... Trying subset instead:
>>> >
>>> >> subset(b,1:5)
>>> > Error in (function (classes, fdef, mtable)  :
>>> >   unable to find an inherited method for function ‘extent’ for signature
>>> > ‘"character"’
>>> >>
>>> > Gives the same error. I'm assuming that this is related to the 4D nature
>>> > of
>>> > the data, as I can't reproduce it elsewise, e.g. using the examples...
>>> > Any
>>> > ideas?
>>> >
>>> > Best wishes,
>>> >
>>> > Mark
>>> >
>>> >         [[alternative HTML version deleted]]
>>> >
>>> >
>>> > _______________________________________________
>>> > R-sig-Geo mailing list
>>> > R-sig-Geo at r-project.org
>>> > https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>> >
>>>
>>>
>>>
>>> --
>>> Michael Sumner
>>> Software and Database Engineer
>>> Australian Antarctic Division
>>> Hobart, Australia
>>> e-mail: mdsumner at gmail.com
>>
>>
>
>
>
> --
> Michael Sumner
> Software and Database Engineer
> Australian Antarctic Division
> Hobart, Australia
> e-mail: mdsumner at gmail.com
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo



More information about the R-sig-Geo mailing list