我将在光栅计算函数中评估文本参数,然后在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命令。我有很多像这样结构化的字符串参数,并且想要评估每个参数,而无需手动复制/粘贴到控制台。
感谢您的帮助!
答案 0 :(得分:0)
我怀疑这是因为函数引用了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]"