0

次の例では、 を使用して祖父母環境から要素を取得しようとしています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であるためexecgwithを呼び出す 2 番目のビットが機能することを期待していました。私の理解では、 を見て、何も見つけられず、その親を見て を見つけましたが、これはうまくいきませんでした。これについて私をさらに混乱させるのは、2 レベル上を検索するように明示的に指示すると、これが機能することです。.env=e1env_getinherit=TRUEcaller_env"a"env_get

この継承がどのように機能するかについて誤解していますか?

4

1 に答える 1