我正在使用 \xe2\x80\x9cterra\xe2\x80\x9d 包处理 SpatRaster 列表。我已经从脚本创建了栅格列表,并保存了 R 环境。但是,当我从另一个脚本加载 SpatRasters 列表时,遇到以下消息错误:
\nError: external pointer is not valid\nRun Code Online (Sandbox Code Playgroud)\n这是一个可重现的示例:
\nlibrary(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\nRun Code Online (Sandbox Code Playgroud)\n您能否提供解决此问题的指导?\xc2\xa0任何帮助将不胜感激。
\n您无法将 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(无需显式换行)。