2012-01-20 15 views
103

R関数で複数のオブジェクトを返すにはどうすればよいですか? Javaでは、私は多分、いくつかのプライベート変数を持っているし、多分、カプセル化しPersonheightageを、クラスになるだろうなど R関数で複数のオブジェクトを返す

しかしRに、私はデータのグループを周りに渡す必要があり

。たとえば、R関数が文字のリストと整数の両方を返すようにするにはどうすればよいですか?

+5

他の言語の人には直感的ではないかもしれませんが、リストはこれを行う方法です。リストと1つの整数の2つの要素を含むリストがあります。 – joran

+9

この質問は[this one](http://stackoverflow.com/questions/1826519/function-returning-more-than-one-value)と非常によく似ています。そこにはいくつかの異なる答えがあります。 – rakensi

答えて

150

他の言語とは異なり、R関数は厳密な意味で複数のオブジェクトを返しません。これを処理する最も一般的な方法は、listオブジェクトを返すことです。その後returnこのリストを

foo <- 12 
bar <- c("a", "b", "e") 
newList <- list("integer" = foo, "names" = bar) 

:あなたは整数fooとあなたの関数内の文字列barのベクトルを持っているのであれば、あなたはこれらの項目を組み合わせたリストを作成することができます。

あなたの関数を呼び出した後、newList$integerまたはnewList$namesでそれぞれの関数にアクセスできます。

その他のオブジェクトタイプは、さまざまな目的でうまく機能する可能性がありますが、開始するにはlistオブジェクトが適しています。

+2

返されたリストの要素を一度に割り当てるには、 を参照してください。http://stackoverflow.com/a/15140507 – papirrin

15

これらの行に沿って何かお探しですか? Javaで同様

x1 = function(x){ 
    mu = mean(x) 
    l1 = list(s1=table(x),std=sd(x)) 
    return(list(l1,mu)) 
} 

library(Ecdat) 
data(Fair) 
x1(Fair$age) 
29

、あなたの情報をカプセル化RにおけるS4クラス作成することができます。そして、あなたの関数は、このクラスのインスタンスを返すことができ

setClass(Class="Person", 
     representation(
      height="numeric", 
      age="numeric" 
     ) 
) 

を:

myFunction = function(age=28, height=176){ 
    return(new("Person", 
      age=age, 
      height=height)) 
} 

とあなたの情報にアクセスすることができます:

aPerson = myFunction() 

[email protected] 
[email protected] 
+0

ここで学ぶだけで、 'aPerson @ age'や'あなたが 'myFunction = function(age = 28、height = 176){...'}を使って年齢と身長を定義しているときは、aPerson @ height'を使用します。私はそれを得ていない(つまり、これがなぜ有用なのか)。クラスのインスタンスを作成した後、そのインスタンスの詳細を知りたいとします。しかし、あなたはクラスをインスタンス化しているので、あなたはすでにこれらの詳細を知っていませんか? – warship

+0

@warshipこれは、オブジェクトを返す方法を説明するための単なるダミーの例です。オブジェクトを構築する方法はここでは重要ではありません。 myFunctionは、他のパラメータから年齢と身長を計算することもできます。 – RockScience

+0

さて、ありがとうございました。私はちょうどR(S3、S4など)でOOPをやっていることについてもう少し詳しく学びたいと思っています。 – warship

1

for()assign()を使用すると、多くのオブジェクトを作成できます。 assign()からの例を参照してください:

for(i in 1:6) { #-- Create objects 'r.1', 'r.2', ... 'r.6' -- 
    nam <- paste("r", i, sep = ".") 
    assign(nam, 1:i) 

新しいオブジェクト

ls(pattern = "^r..$") 
4

ます。また、スーパー割り当てを使用することができますを探しています。

"< - "ではなく、 "< < - "と入力します。この関数は、その名前のオブジェクトの1つの機能レベルを再帰的かつ繰り返し検索します。見つけられない場合は、グローバルレベルで作成されます。

1

これを処理する1つの方法は、情報をプライマリの属性として情報として入れることです。私は強調しなければならない、私は本当にこれが2つの情報が関連しているときにのみこれが適切なことだと思う。

例えば、私は時々大幅にデータフレームの属性として、変数名のリストを格納することで修正されている「重要な変数」または変数の名前隠しておく:

attr(my.DF, 'Modified.Variables') <- DVs.For.Analysis$Names.of.Modified.Vars 
return(my.DF) 

これは私がすることができますがデータフレーム自体に変数名のリストを格納する。

関連する問題