次の例では、 を使用して祖父母環境から要素を取得しようとしていますenv_get
。最初のビットは期待どおりに機能します。
library(rlang)
e1 <- env(a = 'a')
# works as expected
f <- function() {
env_get(
env = caller_env(),
nm = 'a',
inherit = TRUE,
default = 'not found')
}
exec(f, .env = e1)
#> [1] "a"
# two levels deep of function calls doesn't work even though inherit = TRUE
g <- function() f()
exec(g, .env=e1)
#> [1] "not found"
# modifying the depth of caller_env in f does work
f <- function() {
env_get(
env = caller_env(2), # <------ changing this
nm = 'a',
inherit = TRUE,
default = 'not found')
}
exec(g, .env=e1)
#> [1] "a"
reprex パッケージ(v2.0.1)により 2021-12-28 に作成
への呼び出しがhasであるためexec
、g
withを呼び出す 2 番目のビットが機能することを期待していました。私の理解では、 を見て、何も見つけられず、その親を見て を見つけましたが、これはうまくいきませんでした。これについて私をさらに混乱させるのは、2 レベル上を検索するように明示的に指示すると、これが機能することです。.env=e1
env_get
inherit=TRUE
caller_env
"a"
env_get
この継承がどのように機能するかについて誤解していますか?