使用存储在对象中的公式进行栅格函数叠加

时间:2015-01-30 11:31:37

标签: r r-raster

我一直在努力解决问题几个小时,我目前正在努力寻找解决方法。

我想使用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)

enter image description here

# Second, we combine them with a simple addition
raster3 <- overlay(env, fun = function(variable1, variable2) variable1 + variable2)
plot(raster3)

The resulting raster after combination with overlay

因此,在上面的示例中,我们的栅格有两个名为variable1variable2的变量,我们对它们应用公式variable1 + variable2

问题

我正在尝试在函数中使用叠加,我有:

  • 输入栅格堆栈(层数是可变的,以及层的名称)。一个典型的例子是上面的堆栈env
  • 公式(公式总是根据输入栅格堆栈的图层名称编写)。典型示例包括variable1 + variable2variable1 * variable2 + 3 * variable1

我的(不成功)尝试

我能够使用先前存储为对象中的字符串的公式:

form <- "variable1 + 3 * variable2"
raster4 <- overlay(env, fun = function(variable1, variable2) eval(parse(text = form)))

这有效;但是,您可以注意到我仍然需要指定variable1variable2作为参数。我无法弄清楚如何在有趣的情况下自动提供图层名称作为参数。

我试过了:

overlay(env, fun = function(...) eval(parse(text = form)))
overlay(env, fun = function(names(env)) eval(parse(text = form)))

但这些显然不起作用。我已经在函数中使用了可怕的eval(parse())过程,我想找到一个解决方案,它不需要我编写包含整个eval(parse())的通用overlay脚本。

任何见解都将受到高度赞赏;)

2 个答案:

答案 0 :(得分:0)

以下是使用eval(parse())

的丑陋变通方法

目的是创建一个适应输入rasterformula的函数。

  • 公式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)

enter image description here

  • 另一个公式为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)

enter image description here

它适用于两种情况。但这不是一个非常优雅的解决方案

答案 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)