2011-11-21 18 views
16

出力方法はありますか。 2オブジェクトを使用せずにlist()複数の出力を持つ関数から割り当てる方法は?

my.fun=function(vector, index) 
     { 
     a=fun.a(vector, index) 
     b=fun.b(vector, index) 
     output=list(a,b) 
     } 

2つのオブジェクトのリストを出力しますか?

 c=fun.a(vector, index) 
     d=fun.b(vector, index) 

をそしてlist(a,b)と同じ機能のための別のlist(c,d)を望んでいた:私も持っている可能性があることを考えると。

これは私が探している機能の小さな例です。私の機能は大きなオブジェクトに適用され、リストとしてエクスポートされますが、中間的な計算もエクスポートしたいと思います。 1つのオプションは、同じリスト内のすべてをマージすることですが、私はこれに別の解決策があるかどうかを知りたいと思います。

+1

:トリッキーなビットは、私にとっては、envパラメータに与えることを何かを働いていましたか? –

+1

あなたは個人的にそれを取る必要はありません、StackOverflowに多くの重複があり、重複を閉じるとマークすると、サイトをよりきれいに保つのに役立ちます。すべての重複があり、すべてのレビューに長い時間がかかることがあるので、必ずしもすぐに終了するとは限りません。 – MByD

+1

お返事ありがとうございました@BinyaminSharet –

答えて

6

。それはそれは頼まれた後、これは1年の重複問題であることを決定しました

f=function(){ 
    list(a=1,b="my string") 
} 

ret=f() 
list2env(ret,env=environment()) 
#a=ret$a;b=ret$b #Same as previous line 

print(a);print(b) #1 and "my string" 
+0

あなたは 'environment()'を使いたいかもしれません。この場合、グローバル環境を返しますが、これは現在の評価環境であるためです。 –

+0

@JoshuaUlrichが書いたものを展開するために、environment()は現在のスコープ(つまり、ローカル変数がどこに格納されているか)を示します。これは最後に私を最も助けたSOの答えでした:http://stackoverflow.com/a/8773047/841830 –

3

は、私はあなたのリストを使用することに限定されていると信じていますが、彼らが好き組み合わせることができます。

> list(list(a=1, b=2), list(c=3, d=4)) 
[[1]] 
[[1]]$a 
[1] 1 

[[1]]$b 
[1] 2 


[[2]] 
[[2]]$c 
[1] 3 

[[2]]$d 
[1] 4 
3

リターン()オブジェクトは、1つの事...リストやベクトルである必要があります。あなたは、グローバル(またはその他の環境)への他の「プッシュ」何かは、あなたが使用することができますしたい場合は、「< < - 」やevalのようなもの(...、ENVIR = .GlobalEnv)

9

することはできだけreturn一つのオブジェクトで機能。しかし、いくつかの選択肢があります。グローバル環境に中間オブジェクトを割り当てることができます(何も上書きしないように注意する必要があります)。または、関数に環境を渡してオブジェクトを割り当てることができます。ここで

は後者の提案の例です:私はあなたが記述している何のための理想的な list2env

fun <- function(x, env) { 
    env$x2 <- x^2 
    x^3 
} 
set.seed(21) 
x <- rnorm(10) 
myEnv <- new.env() 
fun(x, myEnv) 
# [1] 4.987021e-01 1.424421e-01 5.324742e+00 -2.054855e+00 1.061014e+01 
# [6] 8.125632e-02 -3.871369e+00 -8.171530e-01 2.559674e-04 -1.370917e-08 
myEnv$x2 
# [1] 6.288699e-01 2.727464e-01 3.049292e+00 1.616296e+00 4.828521e+00 
# [6] 1.876023e-01 2.465527e+00 8.740486e-01 4.031405e-03 5.728058e-06 
+0

+1最初は私が "ねえ、それは私の答えでした"と思って、あなたのバージョンが私よりもはるかに構造化されていると思っていました。 –

+0

@DWin:ええ、私は私の執筆中にあなたの答えを見て、投稿するかどうかについて議論しました(彼らは類似しているので)。しかし、それから、同じことを違う方法で説明するのを聞くのが誰かにとって助けになると思った。 –

関連する問題