-2

R での関数型プログラミングに関する基本的な質問があります。

次のようなリストを返す関数があるとします。

myF <- function(x){
   return (list(a=11,b=x))
}

範囲またはベクトルを指定して関数を呼び出したときに返されるリストが、'a' に対して常に同じ長さになるのはなぜですか。例:

myF(1:10)

戻り値:

$a
[1] 11

$b
[1]  1  2  3  4  5  6  7  8  9 10

「a」リストのサンプル長が b になるように動作を変更するにはどうすればよいでしょうか。

私は実際に (as.list を使用して) 簡単にリストに変換できない一連の S4 オブジェクトを扱っているので、_apply は私の最初の選択肢ではありません。

洞察や助けをありがとう!

EDIT(さらに説明を追加)必ずしも「a」をパディングして、その長さをbと等しくすることを検討しているわけではありません。ただし、ソリューション as.list(data.frame(a=myA,b=x)) を使用すると、最初に計算された同じ値で 'a' がパディングされます。

myF <- function(x){
  myA = ceiling(runif(1, max=100))
  return (as.list(data.frame(a=myA
               ,b=x)))
}

myF(1:5)
$a
 [1] 79 79 79 79 79 79 79 79 79 79

$b
 [1]  1  2  3  4  5  6  7  8  9 10

なぜそうなるのかはまだわかりません!

ありがとう

4

4 に答える 4

2

aがbと同じ長さになるように、11を繰り返したいだけですか?もしそうなら:

> myF <- function(x){
+    return (list(a=rep(11,length(x)),b=x))
+ }
> myF(1:10)
$a
 [1] 11 11 11 11 11 11 11 11 11 11

$b
 [1]  1  2  3  4  5  6  7  8  9 10

OPの説明/コメントに基づいて編集します。代わりに「a」を「b」に等しい長さのランダムベクトルにしたい場合:

> myF <- function(x){
+    return (list(a=ceiling(runif(length(x),max=100)),b=x))
+ }
> myF(1:10)
$a
 [1]  4 31  8 45 25 74 36 95 64 32

$b
 [1]  1  2  3  4  5  6  7  8  9 10
于 2012-07-09T22:17:56.923 に答える
1

as.listを使用できないということの意味がよくわかりません。次の手順を実行することで、リストのすべてのコンポーネントが同じ長さであるという要件を満たす関数のバージョンを取得できるはずです。

myF <- function(x){
   return as.list(data.frame(a=11,b=x))
}

編集:理由listはあなたが期待するように機能しないということはlist、多くのリスト/ベクトルなどに適用されるのはまさにそれであり、それらのリスト/ベクトルなどのリストです。それらの構造を「検査」しません。

私が望むのは、リストに含まれるベクトルが一致し、各ベクトルから1つの対応する要素を持つ一連の「行」を生成する追加のセマンティクスです。これはまさにデータフレームが想定されているものです(実際、データフレームはRでどのように表されると思いますか)。最後のas.list呼び出しはほとんど何もしませんが、タグ付けされたタイプを変更します。

EDIT2:上記が間違っている場合(そしてそれがあなたが望む一般的な動作ではない場合)、Macのソリューションがより適切であることに注意してください。これは、両方のベクトルが同じ長さである必要があるという動作を正確に提供するためです。ラインナップ"。

これは、コードを読む人を混乱させるだけでなく(data.frameを使用すると、ベクトルが一致していると考えることを意味します)、リストに追加する追加の要素を適切な長さのベクトルに変換する必要があります(あなたが望むものであるかもしれないし、そうでないかもしれない)

于 2012-07-09T22:17:57.583 に答える
1

前回あなたのことを正しく理解できなかった場合、別の可能性があります:

関数/式を指定して、引数と同じ長さの 2 番目のベクトルを生成する場合は、次のようにします。

myF <- function(x){
   return (list(a=replicate(length(x),f),b=x))
}

あなたの例でfは になる可能性がrunif(1, max=100)ありますが、特定のケースでは、関数内でrunif呼び出して適切な長さのベクトルを生成するように明示的に指示できrunif(length(x), max=100)ます。

replicatefリクエスト回数を単純に再評価し、すべての結果のベクトルを提供します。

于 2012-07-09T23:37:55.593 に答える
0

あなたの機能は「ハードコーディング」されているようです。したがって、何を指定しても、常に 11 になります。

たとえば、関数を次のように変更した場合:

myF <- function(x){    return (list(a=x,b=x)) }

myF(1:10) 

$a
 [1]  1  2  3  4  5  6  7  8  9 10

$b
 [1]  1  2  3  4  5  6  7  8  9 10

a は b のように変更できます。

また

myF <- function(x,y){    return (list(a=y,b=x)) }

myF(10:1,1:10) 
$a
 [1]  1  2  3  4  5  6  7  8  9 10

$b
 [1] 10  9  8  7  6  5  4  3  2  1

これで、a は b とは無関係に変更できるようになりました。

于 2012-07-09T22:29:07.740 に答える