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)

オーバーレイと組み合わせた後の結果のラスタ​​ー

したがって、上記の例では、ラスターに と という 2 つの変数が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)))

これは機能します。ただし、引数としてvariable1andを指定しなければならなかったことに気付くでしょう。variable2fun の引数としてレイヤー名を自動的に提供する方法がわかりません。

私は試した:

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 に答える