web-dev-qa-db-ja.com

R関数で複数のオブジェクトを返す

R関数で複数のオブジェクトを返すにはどうすればよいですか? Javaでは、クラスを作成し、おそらくPersonを作成します。このクラスは、いくつかのプライベート変数を持ち、おそらくheightageなどをカプセル化します。

しかし、Rでは、データのグループを渡す必要があります。たとえば、R関数が文字のリストと整数の両方を返すようにするにはどうすればよいですか?

120
CodeGuy

他の多くの言語とは異なり、R関数は厳密な意味で複数のオブジェクトを返しません。これを処理する最も一般的な方法は、listオブジェクトを返すことです。したがって、関数に整数fooと文字列のベクトルbarがある場合、これらの項目を組み合わせたリストを作成できます。

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

次に、returnこのリスト。

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

他のオブジェクトタイプはさまざまな目的でより適切に機能する可能性がありますが、listオブジェクトは開始するのに適した方法です。

185
ChadBDot

同様に、Javaでは、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()

aPerson@age
aPerson@height
35
RockScience

これらの線に沿って何か探していますか?

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)
18
aatrujillob

スーパー割り当てを使用することもできます。

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

4
Daniel Morgan

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..$")
2
fvfaleiro

これを処理する1つの方法は、情報をプライマリの属性として配置することです。強調する必要があります。これは、一方の情報が他方の情報を持つように2つの情報が関連している場合にのみ行うのが適切だと思います。

たとえば、「重要な変数」または変数名のリストをデータフレームの属性として保存することで大幅に変更された変数の名前を隠します。

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

これにより、データフレーム自体に変数名のリストを保存できます。

1
HoneyBuddha