以下の R コードで foo の x の値を照会するにはどうすればよいですか?
make.foo <- function() {
x <- 123
function() x * 3
}
foo <- make.foo()
# now get foo's x
以下の R コードで foo の x の値を照会するにはどうすればよいですか?
make.foo <- function() {
x <- 123
function() x * 3
}
foo <- make.foo()
# now get foo's x
オブジェクトの環境で何かを探したい場合は、 withを使用get
しinherits=FALSE
ます。そうしないと、関数の親環境で何かを見つける危険があります。上記を使用した例make.foo
:
> z=999
> get("x",environment(foo))
[1] 123
> get("z",environment(foo))
[1] 999
> get("x",environment(foo),inherits=FALSE)
[1] 123
> get("z",environment(foo),inherits=FALSE)
Error in get("z", environment(foo), inherits = FALSE) :
object 'z' not found
2 つ目get
は、クロージャーの環境にないものを取得しようとしても、それが親環境に表示される場合、エラーにならない可能性があることを示しています。これにより、奇妙なバグが発生する可能性があります。inherits=FALSE
すぐにエラーが発生します。
関数には環境があります
から?`function`
クロージャには、フォーマル (引数リスト)、本体 (「使用方法」セクションの expr)、およびクロージャが使用されるときに評価フレームのエンクロージャを提供する環境の 3 つのコンポーネントがあります。
その環境からできるようにget
します(またはを使用してオブジェクトをリストしますls
)
get('x', envir = environment(foo))
## [1] 123
または、環境内のすべてのオブジェクトを知りたい場合
ls(envir = environment(foo))
## 'x'
そして、その環境に割り当てたい場合(つまり、変更x
)
assign('x', 24, envir = environment(foo))
foo()
## 72
環境から削除することもできます
rm(x, envir = environment(foo))
foo()
## Error in foo() : object 'x' not found
次に、グローバルに割り当てられたx
x <- 3
foo()
# [1] 9
function
の環境に再割り当てします
assign('x', 123, envir = environment(foo))
foo()
## [1] 369