0

我已经为一个问题苦苦挣扎了几个小时,目前我很难找到解决方法。

我想使用包的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 + variable2variable1 * variable2 + 3 * variable1

我的(不成功的)尝试

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

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

这行得通;但是,您可以注意到我仍然必须指定variable1variable2作为参数。我无法弄清楚如何在 fun 中自动提供图层名称作为参数。

我试过了:

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

但这些显然不起作用。我已经eval(parse())在函数中使用了糟糕的过程,我想找到一个不需要我编写eval(parse())包含整个overlay.

任何见解将不胜感激;)

4

2 回答 2

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)

在此处输入图像描述

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

于 2015-01-30T13:50:59.610 回答
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))

如果没有“eval(parse(text = form)”业务,您的示例对我来说很好:

raster4 <- overlay(env, fun = function(variable1, variable2) variable1 + 3 * variable2)
于 2016-06-26T04:18:30.373 回答