错误:从 R 环境保存 SpatRasters 时外部指针无效

Mar*_*gis 4 r terra

我正在使用 \xe2\x80\x9cterra\xe2\x80\x9d 包处理 SpatRaster 列表。我已经从脚本创建了栅格列表,并保存了 R 环境。但是,当我从另一个脚本加载 SpatRasters 列表时,遇到以下消息错误:

\n
Error: external pointer is not valid\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个可重现的示例:

\n
library(terra)\nx <- terra::rast(xmin=-110, xmax=-80, ymin=40, ymax=70, ncols=30, nrows=30)\nvalues(x) <- 1:ncell(x)\nr <- c(x, x, x, x)\nr <- list(r, r, r, r)\nsave(r, file = "test.Rdata")\n\nrm(list=ls(all=TRUE))\n\nload("test.Rdata")\nr\n#[[1]]\n#class       : SpatRaster \n#Error: external pointer is not valid\n
Run Code Online (Sandbox Code Playgroud)\n

您能否提供解决此问题的指导?\xc2\xa0任何帮助将不胜感激。

\n

Rob*_*ans 9

您无法将 SpatRaster 对象保存在“.RData”文件中。参见第四段?terra

无论如何,您不应该使用“.RData”文件(因为加载文件时发生的情况是不透明的);最好使用“.rds”文件(用 创建saveRDS)。

这对于SpatRaster列表仍然不起作用,除非您首先“包装”它们。你可以做

library(terra)
x <- terra::rast(xmin=-110, xmax=-80, ymin=40, ymax=70, ncols=30, nrows=30)
values(x) <- 1:ncell(x)
r <- c(x, x, x, x)
r <- list(r, r, r, r)

s <- lapply(r, wrap)
saveRDS(s, 'wrap.rds')

x <- readRDS("wrap.rds")
x <- lapply(x, rast)
Run Code Online (Sandbox Code Playgroud)

但拯救 SpatRasters 的规范且有效的方法是使用writeRaster. 您还可以保存单个 SpatRaster saveRDS(无需显式换行)。