Rでローカル変数をグローバル環境の変数にする方法について。
関数内で宣言された変数はその関数内でしか使えず、関数の実行が終わると利用できなくなります。 例えば以下のようなスクリプトを考えます。
# Main function
main = function(){
subFunction()
}
# Sub functios
subFunction = function(){
# Do some calculations
myData = data.frame( subject=1:9, score=sample(0:100,9,replace=T) )
mScoer = mean( myData$score )
}
# Execute main function
main()
メイン関数とサブ関数があり、サブ関数の中で多少の計算をしています。ここでは架空の被験者データを作成し、成績の平均値を計算しています。このスクリプトを RStudio で実行すると、実行後のワークスペース(グローバル環境の変数)には main と subFunction の2つの関数のみが登録されており、subFunction 内の変数(myDataやmScore)は登録されていません。関数内の変数はその関数におけるローカル変数なのでそうなります。
普通はそれで特に問題ないし良いのですが、例えばスクリプト実行後に、myData 変数を使ってコンソール内でさらに何か追加で処理をしたいと思っても、それができません。この例での myData など、関数内で作成されたローカル変数をグローバルワークスペースに残るようにしたい時、どうすればいいか。assign 関数を使うとそれができます。
# Main function
main = function(){
subFunction()
}
# Sub function
subFunction = function(){
# Do some calculations
myData = data.frame( subject=1:9, score=sample(0:100,9,replace=T) )
mScore = mean( myData$score )
# Forward local variables to workspace
toGlobal( myData, "md" )
toGlobal( mScore, "ms" )
}
# Forward a variable to the global scope
toGlobal = function( var, name ){
assign( name, var, envir = globalenv() )
}
# Execute main function
main()
assign 関数を使うことで、特定の変数の"環境"を変えることができます。
ここでは toGlobal という自作関数(assign関数のラッパー関数)を通して assign 関数を利用しています。
toGlobal 関数の第1引数に変数を、第2引数にワークスペースで表示される際の名前を入れます。
assign 関数の第一引数には割当て後の変数名、第二引数には割当てたい変数、envirには割当て先の環境を指定します。
このスクリプトを実行すると、 main と myFunction に加えて md と ms という変数がワークスペースに表示されるようになります。コンソールで head( md ) などを実行すれば確かに変数が使えるようになっていると確認できます。これで、任意の変数をグローバル環境に残すことができるようになりました。
ちなみに、私はここで使った toGlobal 関数は自作関数用のファイルに書いて RStudio 起動時に自動で読み込ませるようにしています。
コメント