我一直在努力解决问题几个小时,我目前正在努力寻找解决方法。
我想使用overlay
包的raster
功能。此功能根据特定功能(例如数学函数)将多个栅格(或堆栈的栅格图层)组合到新栅格中。
这是一个实际的例子:
library(raster)
# First we create an example raster stack with two layers
a <- matrix(rep(dnorm(1:100, 50, sd = 25)),
nrow = 100, ncol = 100, byrow = TRUE)
env <- stack(raster(a * dnorm(1:100, 50, sd = 25) * 10000),
raster(a * 1:100))
names(env) <- c("variable1", "variable2")
plot(env)
# Second, we combine them with a simple addition
raster3 <- overlay(env, fun = function(variable1, variable2) variable1 + variable2)
plot(raster3)
因此,在上面的示例中,我们的栅格有两个名为variable1
和variable2
的变量,我们对它们应用公式variable1 + variable2
。
我正在尝试在函数中使用叠加,我有:
env
。variable1 + variable2
或variable1 * variable2 + 3 * variable1
。我能够使用先前存储为对象中的字符串的公式:
form <- "variable1 + 3 * variable2"
raster4 <- overlay(env, fun = function(variable1, variable2) eval(parse(text = form)))
这有效;但是,您可以注意到我仍然需要指定variable1
和variable2
作为参数。我无法弄清楚如何在有趣的情况下自动提供图层名称作为参数。
我试过了:
overlay(env, fun = function(...) eval(parse(text = form)))
overlay(env, fun = function(names(env)) eval(parse(text = form)))
但这些显然不起作用。我已经在函数中使用了可怕的eval(parse())
过程,我想找到一个解决方案,它不需要我编写包含整个eval(parse())
的通用overlay
脚本。
任何见解都将受到高度赞赏;)
答案 0 :(得分:0)
eval(parse())
目的是创建一个适应输入raster
和formula
的函数。
variable1 + variable2
form <- "variable1 + variable2"
input.raster <- env
eval(parse(text = paste("custom.overlay <- function(",
paste(names(input.raster), collapse = ", "),
") {",
form,
"}"
)))
raster4 <- overlay(env, fun = custom.overlay)
plot(raster4)
variable1^2 + 3 * variable2
form <- "variable1^2 + 3 * variable2"
input.raster <- env
eval(parse(text = paste("custom.overlay <- function(",
paste(names(input.raster), collapse = ", "),
") {",
form,
"}"
)))
raster5 <- overlay(env, fun = custom.overlay)
plot(raster5)
它适用于两种情况。但这不是一个非常优雅的解决方案
答案 1 :(得分:0)
您不应该引用变量名称,而应该引用它们的位置。然后你可以做,例如:
library(raster)
a <- matrix(rep(dnorm(1:100, 50, sd = 25)), nrow = 100, ncol = 100, byrow = TRUE)
env <- stack(raster(a * dnorm(1:100, 50, sd = 25) * 10000), raster(a * 1:100))
v <- overlay(env, fun=function(x,y) x * y + 3 - sqrt(y / x))
没有&#34; eval(解析(text = form)&#34;业务,你的例子对我来说很好:
raster4 <- overlay(env, fun = function(variable1, variable2) variable1 + 3 * variable2)