3

I'm working on a function for raster package. In the end of the function I have to use stack() to create a RasterStack. When I do this the data source is in memory. I want to have the data source on a file.

For example if I use crop() I can do:

asd <- crop(raster, extent, filename="something.tif")
inMemory(asd)
TRUE

I can't do the same with stack(), but I need to have the results on files, because it writes all files on RasterTmpFiles and I end having memory problems.

5
  • If you don't need the stack for computation you could write your process as a loop. e.g. loop over each raster where you: create/read | analyse | write result || repeat for next raster. Commented Aug 16, 2015 at 21:10
  • I'm sorry but I need the stack for futhers calculation... Commented Aug 17, 2015 at 14:01
  • Will you not continue to have memory problems if you have all the rasters open in a stack? Or do the memory problems happen when you have multiple stacks open? If so, perhaps you can work on one stack at a time. Commented Aug 17, 2015 at 14:03
  • yeah, that's the problem. I have to work with different stacks, and every stack is a different data. I have to combine later those stacks, thats why I have to have all of them open at the same time. And, of course I have memory problems if I try to have all of them in memory. Commented Aug 17, 2015 at 20:54
  • A solution could be to use a raster series in GRASS. You can use the spgrass6 package so your interface is still R, but you'll be handing off the heavy lifting to GRASS which is generally happier about it. Commented Aug 17, 2015 at 20:56

1 Answer 1

6

I'm not sure I'm understanding the question properly but I believe you simply want to write a multispectral raster to disk. If, for example, you want a multilayer geotiff you just have to run the following line of code:

writeRaster(yourStackObject, filename="multilayer.tif", options="INTERLEAVE=BAND", overwrite=TRUE)

In filename you can include whichever path you want or if you only provide the filename the tif is written to your working directory.

getwd()

If you want to load this stack back into R you just have to use the stack or brick functions:

mystack = stack("multilayer.tif")
mybrick = brick("multilayer.tif")

And you can obtain a band from these objects with the subset function, for example:

band1 = subset(mybrick,subset=1)

If temporary files are giving you problems you should clean them every now and then, for example right after writing your raster stacks you can use this code to delete all temporary raster files:

removeTmpFiles(h=0)
1
  • Sounds good. I have to add two more lines to the code, one for saving the raster to a file, and another to load the raster from the file. I was expecting to solve it with less code, like when I use crop. But it's a good approach. Thank you! Commented Aug 18, 2015 at 15:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.