无法使用加载工作区文件完全恢复某些 R 栅格对象

unable to fully restore some R raster objects using load workspace file

我正在使用 R(不是 RStudio)3.3.3 在 Mac0S10.10.5 的 R 栅格包中处理地理参考图像。使用 GUI 将工作区保存到 xxx.RData 文件后,我关闭会话重新启动 R(启动时不读取历史文件),然后使用 GUI 再次加载工作区。当我输入 ls() 时,所有对象(包括我加载的原始完整全局栅格以及我使用 crop() 创建的子集)都会出现。但是,当我绘制栅格时,只有原始的未裁剪图像绘制。裁剪后的子集没有绘制,而是出现以下错误:

>Error in file(fn, "rb") : cannot open the connection
    >In addition: Warning message:
    >In file(fn, "rb") :
    cannot open file          '/private/var/folders/8y/6924gdvx3jg6k2rz5yrzwz100000gr/T/Rtmpc0b3TY/raster/r_tm   p_2017-09-25_180525_90510_17665.gri': No such file or directory

为了找出这个问题,我制作了一个 2x2 栅格数据集,然后制作了它的 1x1 子集。这两个栅格对象都得到恢复并可以使用 plot() 查看。因此,我无法使用这些简单的数据集重现问题。所以这个问题似乎与原始大文件和我裁剪它有关。 此外,如果我重新创建裁剪 ("newfile <- crop(oldfile, extentObject)"),我可以创建一个可见的栅格数据集。但是,如果我尝试保存此工作区并稍后恢复它,我又会回到无法绘制它的状态。如果我执行 writeRaster(),我可以成功写入文件,退出 R,然后重新导入该文件。因此,问题似乎仅限于将整个工作区保存为 "xxx.RData" 文件。

library(raster)
    library(sp)
    library(rgdal)
    fullraster <- raster("raster.tif")
    cropraster <- crop(fullraster,extentobject)
    toyraster <- raster(as.matrix(cbind(c(1,2),c(3,4))))
    toyrastersub <- crop(toyraster, extent(c(0,.5,0,.5)))
    plot (fullraster) # works
    plot (cropraster) # works
    plot (toyraster) # works
    plot (toyrastersub) #works
    writeRaster(cropraster,"croprasterout")
    # Perform Save workspace as... 
    # Exit R
    #open R without reading history file
    # Load Workspace File...
    library(raster)
    library(sp)
    library(rgdal)
    reloadedraster <- raster("croprasterout")
    croprasteragain <- crop(fullraster,extentobject)
    plot (fullraster) #works
    plot (reloadedraster) #works
    plot (toyraster) # works
    plot (toyrastersub) #works
    plot (croprasteragain) # works
    plot (cropraster) # produces error in block quotes above.

我已尝试重新安装 R、重新加载对象、使用默认工作区文件保存,但 none 这些措施解决了问题。我也无法在 Whosebug 或 Internet 上的其他地方找到解决方案。

一个有希望的线索是,当我从加载工作区打印出 "str(cropraster)" 恢复但不可绘制时,它与重新创建的确实有效的略有不同 "str(croprasteragain)" 我正在粘贴不同的输出以下:

str(cropraster)
    > .. .. ..@ name        : chr        >"/private/var/folders/8y/6924gdvx3jg6k2rz5yrzwz100000gr/T/Rtmpc0b3TY/raster/r_t  mp_2017-09-25_180525_90510_17665.grd"

    >  .. .. ..@ datanotation: chr "INT2S"

    >  .. .. ..@ byteorder   : Named chr "little"

    >  .. .. .. ..- attr(*, "names")= chr "value"

    >  .. .. ..@ nodatavalue : num -32768


    str(croprasteragain)
    >   .. .. ..@ name        : chr "/QGISWork/Chelsa1.2/IntegerBioclim/crapdir/junk.rasterout.grd"

    > .. .. ..@ datanotation: chr "FLT8S"

    > .. .. ..@ byteorder   : Named chr "little"

    >  .. .. .. ..- attr(*, "names")= chr "value"

    >  .. .. ..@ nodatavalue : num -1.7e+308

感谢您的帮助!

当您使用 library(raster) 创建栅格时,栅格中包含的数据很可能保存在临时文件夹中(如果足够小,则保存在 RAM 中)。但是数据没有保存在 R-session 中。 R 会话中保存的唯一信息是元数据和数据在 RAM 或磁盘中的位置。
因此,当您保存和恢复会话时,获取栅格数据的唯一方法是确保栅格位于与关闭会话之前相同的位置。如果您不将栅格及其数据保存在已知位置,您将在下一次会话中丢失它。
这就是为什么在你的第二次测试中:

  • plot (fullraster) #works: 它读取 "raster.tif"
  • 中的原始数据
  • plot (reloadedraster) #works: 它读取磁盘上的数据 "croprasterout"
  • plot (croprasteragain) # 有效:裁剪在会话中完成,但数据保存在临时文件中。
  • plot (cropraster) # 在上面的块引号中产生错误:它试图读取上一个会话的临时文件中的数据,该文件在会话关闭时已被删除。

因此,如果您希望能够重新使用以前的光栅对象,您需要使用 writeRaster 并读取它,就像您对 reloadedraster 所做的那样。保存光栅时尝试使用文件扩展名:.grdlibrary(raster).

的默认扩展名

此后我找到了对另一个问题 ( ) 的回答,这帮助我找到了我所知道的最实用的问题解决方案。 @RobertH 对该问题的回答表明,添加 readAll(raster) 将确保将值保存到 .RData 内存中。这似乎工作得相当令人满意:

    fullraster <- raster("raster.tif")
    cropraster.readall <- readAll(crop(fullraster,cropbox2))
    #save and close R session.
    #delete raster.tif file in OS.
    Reopen and restore R session
    plot(fullraster) #doesn’t work, presumably b/c raster.tif deleted.
    plot(cropraster.readall) #WORKS!  

使用 writeRaster 单独保存文件也可以(正如@StatnMap 所建议和解释的那样)。出于我的目的,我发现该解决方案不太受欢迎,因为它似乎需要在 R 会话中仔细注意以单独保存每个必要的光栅文件。