Advanced Rという本を読んでいて、非標準評価の章で繰り返し言及されている「エスケープ ハッチ」の概念と混同していました。たとえば、著者が最初にこの単語に言及したとき、次の定義があります。
開発者は、常にエスケープ ハッチを提供する必要があります。これは、標準評価を使用する関数の代替バージョンです。
また、脱出ハッチに関するいくつかの例もあります。例の 1 つはCalling from another functionの部分からのものです。著者は次のように述べています。
通常、言語での計算は、関数がユーザーによって直接呼び出される場合に最も有用であり、他の関数によって呼び出される場合にはあまり有用ではありません。
以下の例のコードを参照してください。
sample_df <- data.frame(a = 1:5, b = 5:1, c = c(5, 3, 1, 4, 1))
subset2 <- function(x, condition) {
condition_call <- substitute(condition)
r <- eval(condition_call, x, parent.frame())
x[r, ]
}
scramble <- function(x) x[sample(nrow(x)), ]
subscramble <- function(x, condition) {
scramble(subset2(x, condition))
}
しかし、うまくいきません:
subscramble(sample_df, a >= 4)
# Error in eval(expr, envir, enclos) : object 'a' not found
traceback()
#> 5: eval(expr, envir, enclos)
#> 4: eval(condition_call, x, parent.frame()) at #3
#> 3: subset2(x, condition) at #1
#> 2: scramble(subset2(x, condition)) at #2
#> 1: subscramble(sample_df, a >= 4)
著者は、この場合、すでに引用された式を取るサブセット 2() のバージョンを書くことができると言いました。コードを以下に示します。
subset2_q <- function(x, condition) {
r <- eval(condition, x, parent.frame())
x[r, ]
}
subset2 <- function(x, condition) {
subset2_q(x, substitute(condition))
}
subscramble <- function(x, condition) {
condition <- substitute(condition)
scramble(subset2_q(x, condition))
}
その後、うまく動作します:
subscramble(sample_df, a >= 3)
#> a b c
#> 4 4 2 4
#> 5 5 1 1
#> 3 3 3 1
subscramble(sample_df, a >= 3)
#> a b c
#> 5 5 1 1
#> 3 3 3 1
#> 4 4 2 4
著者は例を挙げていますが、まだエスケープハッチを理解していません。それで、誰かがこの本またはRプログラミング言語でその定義を説明できますか? 私のセッション情報:
sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
Matrix products: default
locale:
[1] LC_COLLATE=Chinese (Simplified)_People's Republic of China.936
[2] LC_CTYPE=Chinese (Simplified)_People's Republic of China.936
[3] LC_MONETARY=Chinese (Simplified)_People's Republic of China.936
[4] LC_NUMERIC=C
[5] LC_TIME=Chinese (Simplified)_People's Republic of China.936
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.5.0 tools_3.5.0 yaml_2.2.0