14

1 つの関数から 4 つの異なるデータ フレームを返すことは可能ですか?

シナリオ:

ファイルを読み取って解析し、ファイルの一部を返そうとしています。

私の関数は次のようになります。

parseFile <- function(file){

     carFile <- read.table(file, header=TRUE, sep="\t")

     carNames <- carFile[1,]
     carYear  <- colnames(carFile)

     return(list(carFile,carNames,carYear))
}

list(carFile,carNames,carYear) を使用する必要はありません。最初にリストに戻さずに 3 つのデータ フレームを返す方法はありますか?

4

3 に答える 3

24

R は複数の戻り値をサポートしていません。次のようなことをしたい:

foo = function(x,y){return(x+y,x-y)}
plus,minus = foo(10,4)

うん?まあ、あなたはできません。R は複数の値を返すことができないというエラーが表示されます。

あなたはすでに解決策を見つけました - それらをリストに入れて、リストからデータフレームを取得してください。これは効率的です。メモリの 1 つのブロックから別のブロックへのデータ フレームの変換またはコピーはありません。

これも論理的です。関数からの戻り値は、概念的には、それを呼び出している関数に転送される何らかの意味を持つ単一のエンティティである必要があります。リストの戻り値に名前を付けると、この意味もよりよく伝わります。

呼び出し環境で複数のオブジェクトを作成する手法を使用することもできますが、それを行うと子猫が死んでしまいます。

carYearあなたの例ではデータフレームではないことに注意してください-列名の文字ベクトルです。

于 2012-11-24T08:29:03.253 に答える
3

本当に必要な場合は、R でそれを行う方法が他にもあります。

assign('carFile',carFile,envir=parent.frame())

それを使用すると、呼び出し環境で carFile が作成されます。Spacedman が示したように、関数から返すことができるのは 1 つだけであり、クリーンな解決策はリストを使用することです。

さらに、私の個人的な意見では、1 つの関数で複数のデータフレームを返す必要があると感じたり、これまで誰もやったことがないことをしたりするような状況に陥った場合は、アプローチを本当に見直す必要があります。ほとんどの場合、おそらく追加の機能を使用するか、推奨される (つまり、リスト) を使用して、よりクリーンなソリューションを見つけることができます。

言い換えれば、

envir=parent.frame()

仕事をしますが、SpacedManが述べたように

あなたがそれをすると、子猫は死ぬ

于 2014-01-07T17:05:42.493 に答える