在栅格计算函数中评估文本

Evaluating text within a raster calc function

我想评估栅格计算函数中的文本参数,然后使用 R 栅格包中的并行处理来映射该函数。

下面的代码工作正常(但不可取):

library(raster)
library(snow)
library(doParallel)

# using a RasterStack as input
r <- raster(ncols=36, nrows=18)
r[] <- 1:ncell(r)
s <- stack(r, r*2, sqrt(r))

# create the raster calculation function
f1<-function(x) calc(x, fun=function(x){
rast<-(x[1]/x[2])*x[3];return(rast)
})

# Map it using parallel processing capabilities (via clusterR in the raster package)
beginCluster()
pred <- clusterR(s, fun=f1, filename=paste("test.tif",sep=""),format="GTiff",progress="text",overwrite=T)
endCluster()

我希望上面的栅格计算函数是一行可以在栅格函数本身中计算的文本,像这样:

#Create the equivalent string argument
str<-"rast<-(x[1]/x[2])*x[3];return(rast)"

#Evaluate it in the raster calculation function using eval and parse commands
f1<-function(x) calc(x, fun=function(x){
eval(parse(text=str))
})

#Map it using parallel processing capabilities (via clusterR in the raster package)
beginCluster()
upper_pred <- clusterR(s, fun=f1, filename =paste("test.tif",sep=""),format="GTiff",progress="text",overwrite=T)
endCluster()

不幸的是,这个方法在 ClusterR 函数中失败了。

我需要做什么才能使第二种方法起作用?似乎在栅格计算中无法识别 eval 命令。我有很多这样结构的字符串参数,并且想评估每个参数而不必手动 copy/paste 进入控制台。

感谢您的帮助!

我怀疑是因为该函数引用了 str,它在您的主 R 进程的全局环境中定义,但未导出到集群。一个可能更简洁的选择是从 str:

生成一个函数
f1 <- eval(parse(text = paste0("function(x) calc(x, fun = function(x){", str, "})")))

您甚至可以使用一个函数来执行此操作:

make_f1 <- function(str) {
  eval(parse(text = paste0("function(x) calc(x, fun = function(x){", str, "})")))
}
f1 <- make_f1(str)

同样值得注意的是,您的特定示例可以简化为:

str<-"x[1]/x[2])*x[3]"