わかりました。S4 クラスを使用して非常に複雑なオブジェクトを構築しようとしています。スロットには、半ダースのマトリックス、いくつかのリスト、およびおそらくキッチン シンクが 1 つまたは 2 つ含まれています。オブジェクトは、定義済みの構成オブジェクトを参照して展開することで初期化されます。setClass() でクラスを定義するのは簡単ですが、setMethod("initialize") でスロットを設定する洗練された方法を見つけるのに苦労しています。
問題は、その構成オブジェクトの一部に基づいて、これらの半ダースの行列の特定の要素を設定する必要があることです。構成オブジェクトの各要素に対して、いくつかのマトリックスの特定の要素を設定する必要がある場合があります。行列は初期化関数のスコープ/環境にあることに注意してください。次に、行列への実際の割り当てを行う初期化関数内にネストされた関数があります。とにかくそれがアイデアです。これらの関数はもちろん行列を見ることができますが、変更することはできません元の変数が現在の環境で定義されていない場合、<- 演算子によって新しい行列が作成されるためです。R は値渡しであり、それを意味します。これは、初期化しようとしている .Object のスロットにも当てはまります。したがって、ネストされた関数を使用して初期化を行うことはできません。
残念ながら、これらのネストされた関数はいくつかの行列を変更する必要があるため、メインの初期化関数で値を返したり代入を行ったりすることは実用的でもエレガントでもありません。(ただし、行列のコピーを返されたリストに詰め込んでから、それらをメインの初期化関数に結合した場合は可能です。ただし、醜いので、多くの追加コードが必要になります。)
また、構成オブジェクトの階層的な性質のため、再帰呼び出しでトラバースする必要があるため、反復 (このスコーピングの問題を防ぐ) もあまり実用的ではありません。
私が考えることができる最後のオプションは、割り当てを強制的に非ローカル変数に適用するために、envir オプションを指定して assign() 関数を使用することです。しかし、goto ステートメントのように、そのような環境を使用するのは面倒に思えます...
では、最も海賊的なアプローチは何ですか? 冗長な行列を非効率的に渡すためだけに、純粋な関数型プログラミングに固執し、醜いデータ構造を構築しますか? 関数を完全に回避する反復的な解決策を見つけてみませんか? 環境をいじって深い魔法を使う?