1. ホーム
  2. r

[解決済み] 複数の値を返す関数から代入する方法は?

2022-02-19 22:01:20

質問

Rのロジックをまだ理解しようとしています。複数の値を返す関数から結果を(LHSで)アンパックする最善の方法は何でしょうか?

どうやらできないようです。

R> functionReturningTwoValues <- function() { return(c(1, 2)) }
R> functionReturningTwoValues()
[1] 1 2
R> a, b <- functionReturningTwoValues()
Error: unexpected ',' in "a,"
R> c(a, b) <- functionReturningTwoValues()
Error in c(a, b) <- functionReturningTwoValues() : object 'a' not found

を本当にしなければならないのでしょうか?

R> r <- functionReturningTwoValues()
R> a <- r[1]; b <- r[2]

とか、Rプログラマはもっとこう書くのだろうか。

R> functionReturningTwoValues <- function() {return(list(first=1, second=2))}
R> r <- functionReturningTwoValues()
R> r$first
[1] 1
R> r$second
[1] 2

--- シェーンの質問に答えるために編集されました ---。

結果値の部分に名前をつける必要はないんです。 私は、1つの集約関数を最初のコンポーネントに、もう1つの集約関数を2番目のコンポーネントに適用しています ( minmax もし、両方のコンポーネントに同じ機能があれば、分割する必要はありません)。

どのように解決するのですか?

(1) リスト[...]<-。 10年以上前に投稿したことがある r-help . それ以来、gsubfn パッケージに追加されました。これは特別な演算子を必要としませんが、左辺を list[...] このように

library(gsubfn)  # need 0.7-0 or later
list[a, b] <- functionReturningTwoValues()

もし、1つ目か2つ目のコンポーネントだけが必要なら、これらもすべて機能します。

list[a] <- functionReturningTwoValues()
list[a, ] <- functionReturningTwoValues()
list[, b] <- functionReturningTwoValues()

(もちろん、1つの値しか必要ないのであれば functionReturningTwoValues()[[1]] または functionReturningTwoValues()[[2]] で十分です)。

より多くの例については、引用したr-helpのスレッドを参照してください。

(2)で もし、単に複数の値を組み合わせて、その後に返す値に名前を付けるだけなら、単純な代替案として with :

myfun <- function() list(a = 1, b = 2)

list[a, b] <- myfun()
a + b

# same
with(myfun(), a + b)

(3)添付ファイル もう一つの選択肢はattachです。

attach(myfun())
a + b

追加されました。 withattach