1

スタックオーバーフローの質問をたくさん読んだ後、グローバル変数の割り当てについて少し混乱しています。私はRのグローバル変数と他の同様の質問を経験しました

私は次のような状況にあります。2つのグローバル変数current_idxprevious_idx。これらの2つのグローバル変数は、参照クラスのメソッドによって設定されています。

基本的に、<<-代入演算子の使用は正しく機能するはずですか?しかし、私はこの警告を受け取ります

Non-local assignment to non-field names (possibly misspelled?)

どこが間違っているのですか?

編集

作品を使用assign(current_idx, index, envir = .GlobalEnv)する、すなわち私は警告を受けません。誰かがこれに光を当てることができますか?

4

2 に答える 2

4

環境の一種である「グローバル変数」と参照クラスを混同しています。実行<<-すると、関数のparent.frame内のその名前の変数に割り当てられます。.GlobalEnvから1レベル下にある場合は、assignステートメントと同じことを行います。

参照クラスアイテムがある場合は、その中に次の名前でアイテムを割り当てることができます。

ref_item$varname <- value

とはいえ、言うのは簡単です。まず、ReferenceClassを適切に設定する必要があります。

http://www.inside-r.org/r-doc/methods/ReferenceClasses

于 2013-01-25T19:40:18.717 に答える
2

これは、参照クラスメソッド内から参照クラスのフィールドを変更するためのデフォルトのメソッドがを使用するために発生しています<<-。たとえば、次のようになります。

setRefClass(
  "myClass", 
  fields=list(a="integer"), 
  methods=list(setA=function(x) a <<- x)
)

メソッドaを介して参照クラスのフィールドを変更できます。setAこれは参照クラスのメソッドを介してフィールドを設定する標準的な方法であるため、Rは参照メソッド内での他の使用は<<-誤りであると想定します。したがって、参照クラス以外の環境に存在する変数に割り当てようとすると、Rは<<-、参照メソッドでの使用は参照フィールドの変更のみであると考えられるため、タイプミスがある可能性があることを「わかりやすく」警告します。 。

を使用して、グローバルオブジェクトに割り当てることができます<<-。警告は、意図していないことをしている可能性があるという単なる警告です。グローバル環境でオブジェクトに書き込む場合は、警告は適用されません。

を使用assignすることにより、参照メソッドが実行するチェックをバイパスして、参照メソッド内の割り当てのフィールド名を誤って入力していないことを確認し、警告が表示されないようにします。assignまた、実際には指定した環境をターゲットにしているのに対し<<-、字句検索パスでその名前の最初のオブジェクトが見つかることに注意してください。

とはいえ、実際に参照メソッドをグローバル環境に直接書き込みたい場合は、非常にまれです。あなたは自分がしていることを再考する必要があるかもしれません。これらの2つの変数が、グローバル変数ではなく、参照クラスの単なるフィールドではない理由を自問する必要があります。

于 2016-10-13T01:01:41.743 に答える