2016-06-01 14 views
1

グローバル環境内の関数から変数を格納しようとしていますが、私が見つけた解決策はどれもSO postまたはdifferent SO postでした。これは私の問題を説明するための非常に簡単な例です。私の実際の関数は数十の変数を作成するので、<<-を使ってvをグローバルにすることはできません。グローバル環境内の関数から変数を格納する

コード(main_file.R)

source("function_me.R") 
#environment(doGlobalThing) <-parent.frame(2) #didnt work 
doGlobalThing() 
v #cant get to this var from the global environment 

コード(function_me.R)

doGlobalThing<-function(){ 
    #eval(v<-'hi',env=parent.frame(2)) #tried this, didnt work 
    v<-'hi' 
} 
+1

言語の設計に対しては対処しないでください。関数型プログラミングを学ぶ。 – Roland

+0

@Roland、関数型プログラミングのいくつかの教義に基づいたEMPTYグローバル環境で、グローバル変数の新しいセットを作成する私の考えがなぜ間違っているのかを簡単に説明できますか? – Rilcon42

+2

これを実行する利点は、関数から必要なもの、例えばリストを返すことには全くありません。しかし、注意するように、関数にサイト効果があり、問題が発生しないことを覚えておかなければならないという負担が生じます。そして、もちろん、それはあなたが本当にあなたのコードを他人に与えたり、簡単に再利用することはできないということです。これを行うことができる唯一の状況は、参照によって割り当ててその場で修正しようとしていた場合ですが、グローバルな環境ではなく別の環境で行う必要があります(または参照クラスを使用する)。 – Roland

答えて

4

あなたはassignを使用することができます。

assign("v","hi",envir = globalenv()) 

これは、あなたが名前を持っていることが必要です文字列としてのターゲットグローバル変数がありますが、それは数十のベクトルの場合でも簡単に行うことができます。

This questionは、assign<<-の違いについて説明しています。主な違いは、assignでは環境を指定できるため、非グローバルで永続的な環境にデータを格納するのに使いやすいため、たとえば、 Rの静的変数をエミュレートします。assignを使用して地球環境を変更することは可能ですが、そうすることはあまり良いことではありません。上書きしたくないデータを間違って上書きする危険性はあまりありません。グローバル変数を大量に使用するコードは、ほとんどの場合、常にリファクタリングされていないクリーンなコードになります。関数から呼出し環境に多くの異種データを取得する必要がある場合、最もクリーンな解決策は、必要なデータをリストに戻すことです。

accepted answerは良い引用符で<<-assignのその議論を終了します。

悪と間違った使用が地球 環境の中で変数を変更することです。

+0

これは当てはまりますが、私はもっと一般的な解決方法が望まれていました....できれば、関数内で作成されたすべての変数を1回の呼び出しでグローバルにするメソッド – Rilcon42

+0

あなたのソリューションとして '<< - 'を簡単に使うことができますあなたのことは私には新しかった – Rilcon42

+0

TIはそれを 'for'ループか' apply'関数のどちらかで 'assign'を使って呼び出します。しかし副作用がそれにふさわしいかどうかという疑問が依然として残っています。大域環境から格納してアクセスする必要のある値を、オプション内のリストまたは別の環境に格納する方がよい場合がよくあります。 – Benjamin

関連する問題