r - 尝试写入或绘制栅格时 .local(object, ...) 中的错误
问题描述
我有一个 randomForest 模型,我试图在研究区域进行预测。我能够毫无错误地运行预测,并且我可以看到它产生了一个栅格,但是当我尝试运行writeRaster()
or时plot()
,我得到了错误Error in .local(.object, ...)
而没有任何更多信息。这是代码(注意 envStack 是环境预测器的栅格堆栈,rf.full 是 randomForest 模型对象):
library(here)
library(raster)
library(randomForest)
setwd(here("species", model_species, "outputs", "grids"))
fn <- paste0(model_run_name, "_raw_", Sys.Date(), ".tif")
outRas <- predict(object = envStack,
model = rf.full,
type = "prob",
index = 2,
na.rm = TRUE,
filename = fn,
format = "GTiff",
overwrite = TRUE,
progress = "text")
writeRaster(outRas, filename = fn, format = "GTiff", overwrite = TRUE)
而且,这是错误:
.local(.Object, ...) 中的错误:
如果我尝试绘制输出栅格,也会发生同样的事情:
plot(outRas)
.local(.Object, ...) 中的错误:
我包括了 envStack 和 rf.full 对象的屏幕截图,以及预测中的 outRas 栅格产品。为了检查问题是否是文件大小问题,我使用了object.size(outRas)
,它返回了12832 bytes
. 我还检查了要存储光栅的驱动器上的可用空间,并且有超过 60 GB 的可用空间:
我不确定为什么堆栈中的许多栅格的最小值和最大值是未知的,但为了确保各个栅格没有损坏,我尝试绘制一个缺少最小值/最大值(plot(envStack[[1]])
)的栅格,它绘制得很好:
模型对象 ( rf.full
) 已成功用于计算各种验证指标,据我所知,它没有问题,并且我要保存输出栅格的文件夹存在。
当我使用 检查临时文件位置时rasterTmpFile()
,它返回一个不存在的文件(尽管包含文件夹存在):
rasterTmpFile()
[1] "C:/Users/username/AppData/Local/Temp/Rtmpkxfn1t/raster/r_tmp_2020-02-17_152958_23480_67648.grd"
我觉得我以前遇到过这个问题,但我不记得我是如何解决它的(或者我是否解决了它)。我在这里看到的相关问题指向文件大小和文件位置问题,这似乎不是我的问题。一些提示格式类型的问题,但我最近在上周使用writeRaster()
with在此过程的早期步骤中将其他栅格保存为 GeoTiffs format = "GTiff"
。此外,当我尝试outRas
在 R 中绘图时遇到同样的错误,这使得光栅本身似乎存在问题。任何帮助表示赞赏。
更新:问题原来是该writeRaster()
语句是不必要的。把它拿出来解决了这个问题。有关更多详细信息,请参阅下面的答案。
解决方案
我弄清楚我做错了什么。我将该代码位嵌入到 if/else try 语句中,因此它试图运行预测并将光栅写入同一运行的一部分。但是,该writeRaster()
行是不必要的,因为该predict()
函数包含一个filename=
用于保存文件的参数。通过告诉它在以某种方式混淆 R 并导致它抛出该错误之后立即写入光栅。因此,我删除了该writeRaster()
声明,它解决了问题。
推荐阅读
- ruby - 如果它等于特定值,则在 Ruby 中更改变量的优雅方式
- excel - Set Shape .OnAction 导致 1004 错误:应用程序定义或对象定义错误
- java - 当我从屏幕返回时调用 OnChanged ()?
- c++ - 简单的互斥保护队列与 C++ 中的线程安全队列
- node.js - 如何使用 $lookup 而不是填充
- php - Laravel 迁移相同的外键依赖于 2 个不同的表
- kubernetes - 为什么 Kubernetes 返回未经授权的错误?
- react-native - Expo - 在物理设备上运行时独立 APK 崩溃;在 expo-cli 上运行的应用程序
- java - 通过java 8中的收集器max函数找出具有最大年龄的员工列表
- java - @PathVariable 与 @RequestBody(哪一个以及何时?)