3

以下の R コードで foo の x の値を照会するにはどうすればよいですか?

make.foo <- function() {
    x <- 123
    function() x * 3
}

foo <- make.foo()

# now get foo's x
4

2 に答える 2

3

オブジェクトの環境で何かを探したい場合は、 withを使用getinherits=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すぐにエラーが発生します。

于 2012-09-28T07:15:55.000 に答える
3

関数には環境があります

から?`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
于 2012-09-28T05:28:01.640 に答える