私は数時間問題に苦しんでおり、現在、回避策を見つけるのに非常に苦労しています.
パッケージの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)))
これは機能します。ただし、引数としてvariable1
andを指定しなければならなかったことに気付くでしょう。variable2
fun の引数としてレイヤー名を自動的に提供する方法がわかりません。
私は試した:
overlay(env, fun = function(...) eval(parse(text = form)))
overlay(env, fun = function(names(env)) eval(parse(text = form)))
しかし、これらは明らかに機能しませんでした。私はすでに関数内でひどい手順を使用しています.全体を網羅eval(parse())
する一般的なスクリプトを書く必要のない解決策を見つけたいと思います.eval(parse())
overlay
どんな洞察も大歓迎です;)