2016-12-01 11 views
1

ABはベクトルを入力として示しています。私の質問は、私がこの機能のために異なる数の獣医師を持つことができる方法です。私の機能では、nは固定されており、サンプル数を示しています。たとえば、この場合でも私の関数が動作する必要があります:sample_sum (A, B, C, D, E, n, ...)。 また、ベクトルAとBのサンプル(つまり、sample_A <- qss(A, n=n, ...))を入手する部分については、forのループを使用していない異なる数のベクトルに変更する方法があります。forループが十分に速くないためです。関数の入力数の可変 - R

おかげ

sample_sum <- function(A, B, n, ...) 
{ 
    qss <- function(X, n, ...) 
    { 
    r_X <- range(X) 
    dens_X <- density(X, ...) 
    sample(dens_X$x, size=n, prob=dens_X$y, replace=TRUE) 
    } 
sample_A <- qss(A, n=n, ...) 
sample_B <- qss(B, n=n, ...) 
sample_A + sample_B 
} 
+0

あなたは単にあなたの入力のためのベクトルのリストを使用することができませんでしたか?それはあなたの求めるものではありませんが、目的を果たすだけのものです。どのような数のベクトルが期待できますか?ループはそれらを処理するのに十分速くないと結論づけていますか?それは時期尚早の最適化である可能性が高い。 – Bernhard

+0

@Bernhard、あなたのヒントをありがとう。つまり、私はA、B、..ベクトルをリストに置き換えました。また、 "サンプル"の部分にはループを使用していますか?ヒントをスクリプトとして提供してもよろしいですか?ありがとう – Eric

+1

一方、これはすでにUser2321によって提供されているようです。彼はループを使用しなかったが「適用する」が、それはわずかな違いに過ぎない。初心者のためのループはしばしば読みやすく、上級プログラマには '適用 'されますが、速度面ではそれほどRの違いはありません。 – Bernhard

答えて

1

私は何が必要だと思う以下の通りです:

new_sample_sum <- function(my_vector_list, n, ...) 
{ 
    qss <- function(X, n, ...) 
    { 
    r_X <- range(X) 
    dens_X <- density(X, ...) 
    sample(dens_X$x, size=n, prob=dens_X$y, replace=TRUE) 
    } 

    rowSums(sapply(my_vector_list, qss, n = n)) 

} 

あなたが複数のベクターをあなたのベクトルリストでを入れ、その後、ベクトルの数を気にすることなく、リストの上に計算を行うことができます。計算の簡単な注記では、サプリはリスト内のすべてのベクトルをループし、テーブルを返します。各ベクトルにqssを適用したすべての結果が返されます(すべてのベクトルに対して、結果はサプリーが返すテーブルの1つのカラムです) 。関数の最後のステップでベクトルを追加するので、すべての結果を含むテーブルのrowSumsを実行します。

性と一貫性を証明するために:

set.seed(1) 
x <- c(1,2,3,4) 
y <- c(6,7,9,0) 
z <- c(2,2,2,2) 

> sample_sum(x, y, n=2) 
[1] 6.545129 13.474390 

> new_sample_sum(list(x, y), n = 2) 
[1] 6.545129 13.474390 

以上のベクトルを持つ:

sample_sum <- function(A, B, C, n, ...) 
{ 
    qss <- function(X, n, ...) 
    { 
    r_X <- range(X) 
    dens_X <- density(X, ...) 
    sample(dens_X$x, size=n, prob=dens_X$y, replace=TRUE) 
    } 
    sample_A <- qss(A, n=n, ...) 
    sample_B <- qss(B, n=n, ...) 
    sample_C <- qss(C, n=n, ...) 
    sample_A + sample_B + sample_C 
} 

set.seed(1) 
> sample_sum(x, y, z, n = 2) 
[1] 6.102482 15.450364 
set.seed(1) 
> new_sample_sum(list(x, y, z), n = 2) 
[1] 6.102482 15.450364 
0

だけで動的ベクトル引数のサイズを決定するためにn=length(A)を使用しています。

+0

私はあなたが私の質問を誤解したと思います。私はベクトルの長さを取得したくない、私は関数の入力としてベクトルの異なる数を持っている必要があります – Eric

+0

私はそれを理解しました。私の答えはあなたの質問の第二の部分です。 – TMOTTM

関連する問題