2016-05-16 9 views
2

関数A内には、関数Aの環境から4つのオブジェクトを取り出して変更する関数Bがあります。次に、これらのオブジェクトを関数Aの環境に戻す必要があります。R:関数内の関数:管理環境

私はベストプラクティスの推奨事項を探しています: 現在、私がしていることは:関数Bはオブジェクトを含むリストを返し、各オブジェクトは上書きされます機能の環境A.これを処理するより良い方法はありますか? 管理環境に関する議論は非常に複雑であり、これはコミュニティにとって重要で簡単な質問です。以下は

は私の実装

Function A = getObjects(A,B,C){ 

A= A+1 
B= B+1 
C= C+1 

# Function B returns a list containing the object after certain operations were # performed on these 

listFromFunctionB = FunctionB(A,B,C) 

A = listFromFunctionB$A 
B = listFromFunctionB$B 
C = listFromFunctionB$C 

#Other operations keep going on objects A,B and C 
} 
+0

これらのオブジェクトは、常に一緒に行く場合それらをリストに保持する方が理にかなっています.3つのS3クラスを一緒に作成することさえ可能です。 – Gregor

+0

より具体的にお願いしますか? – Fredkho

+0

私は答えを加えました。私は、あなたがやっていることの種類についてより具体的になる前に、私がそれよりも具体化できるとは思わない。しかし、tl; drは*それらをリストに入れて、それらをリストから取り除き、すべてのステップでそれらを戻す代わりに 'lapply' *を使用します。 – Gregor

答えて

2

のいくつかの擬似コードは、おそらくあなたがすでに持っているものよりは良い練習がないです。

機能プログラミング言語(Rなど)では、通常、関数が入力パラメータを変更することを許可しません。

さらに、R関数は1つのオブジェクトのみを返します。そのため、オブジェクトA、B、およびCを含むリストの戻り値も正しい方法です。

+0

これらの2つの機能を同じ環境に設定するにはどうすればよいですか? ほとんどの場合は推奨されていませんが、上記ではリストと出力を処理しないようにしています – Fredkho

+0

@tonyによれば、リストの受け渡しは推奨されています。唯一の方法ではありません。 << - またはassign()を使用して関数内から親スコープ内の値を変更することは可能ですが、通常は悪い方法であり、意図しない副作用を引き起こす可能性があります。私はあなたがこの答えにあるアドバイスを受け入れ、リストを使って関数から複数の値を返すことを強くお勧めします。 R infernoから引用する。「もしあなたが<<が必要だと思うなら、もう一度考え直してください。あなたはまだあなたが<<が必要だと思うなら、もう一度考えてください。 – dww

0

あなたのおもちゃの例からは分かりにくいですが、3つのオブジェクトA、B、Cがあり、それらはすべて一緒に操作され、一緒に回っているようです。途中でリストから取り除き、それぞれに何かを行い、それらを関数に戻すことができるようにリストに戻します。

一般に、これは良いです。複数のオブジェクトを返すことはできないので、それらをリストに戻す必要があります。廃棄物はその都度リストから取り除かれます。なぜ迷惑?

実際、lapplyではリストの各項目に同じことをするのは簡単です。あなたのコードでは、行をコピー/貼り付けしてABに変更してからCに変更するように見えます。良いプログラミングには、ほとんどコピー/ペーストが必要です。

A, B, Cの関数を書くのではなく、list(A, B, C)を入力とする関数を記述します。 のあなたが持っている

唯一の例ここではA、BおよびCに1を加算しているものをやっては、彼らがリストにあった場合、あなたはそれを行うだろうかです:

FunctionA = function(ABClist) { 
    # add 1 to each list element 
    return(lapply(ABClist, function(x) x + 1)) 
} 
関連する問題