7

環境内の名前に値を割り当てることと、変数の環境を設定することの違いは何ですか?ドキュメントからはわかりませんでした。

例えば:

MyTestFunc = function(x)
{
    myVal = "abcde"

    # what is this doing?  why is myVal not in the global environment after 
    # this call? I see it adds an environment attribute to the variable, 
    # but what good is that?
    environment(myVal) = globalenv()

    assign( "myVal" , myVal , envir = globalenv() )

    # this seems to copy graphics:::rect to the current environment which seems 
    # to contradict the behavior of environment( myVal ) above
    environment( rect ) = environment()

    # this seems to do the same thing
    assign( "rect" , rect , envir = globalenv() )
}

# this prints out rect, but shows <environment: namespace: graphics>!
rect
4

2 に答える 2

6

割り当て関数は、指定された環境で名前を値にバインドするだけです。

ただし、環境置換関数は2つのことを行います。その主な目的は、関数クロージャの環境を変更することです。その環境は、関数の本体コードがグローバル変数と関数を探す場所です。通常、この環境は関数が定義された環境です(したがって、プロンプトで定義すると、globalenvが使用されます)。「ボーナス」として、他のオブジェクトタイプに.Environment属性を割り当てるだけです。これはほとんどのオブジェクトにはまったく役に立ちません、数式で使用されます。

2つ目は、他の置換関数とほぼ同じように機能することです。名前が現在の環境に存在する場合は直接変更し、そうでない場合はローカルコピーを作成して変更します。したがって、あなたの場合、rect関数のローカルコピーを作成し、その環境を変更します。元の機能は変更されません。

# showing names replacement behavior
f <- function() {
  names(letters) <- LETTERS
  letters # the local modified copy
}
f() # prints changed letters
letters # unchanged
于 2011-12-27T14:55:39.727 に答える
1

あなたが尋ねて実行した関数の内部:

 # what is this doing?  why is myVal not in the global environment after this call?
    # I see it adds an environment attribute to the variable, but what good is that?
    environment(myVal) = globalenv()

myValしたがって、関数内にある「abcde」という名前のオブジェクトには実際には何もしませんでした。代わりに、関数の環境内に「abcede」という名前の新しい環境を作成しました。次に、以下を実行しました。

assign( "myVal" , myVal , envir = globalenv() )

ローカル関数環境から収集した文字モード値「abcde」で「myVal」という名前の変数を作成し、グローバル環境に配置しました。現在、「。Environment」という名前の属性があります。ただし、環境は関数のスコープを定義するために使用されるように設計されているため、目標が何であるかは不明なままです。データオブジェクトに環境を割り当てるのは奇妙なことです。変数は環境内にありますが、変数の環境を設定するのに役立つ目的はないようです。だから私はあなたの質問への答えだと思います:...それは何が良いですか?」は「それは何の役にも立たない」であるべきです。

于 2011-12-26T16:30:39.760 に答える