1

この種のことは F# では簡単ですが、R で行う方法がわかりません。クロージャーから生成された値を使用してベクトルを生成したいと考えています。F# では、次のように動作します。最初の引数は必要な要素の数、2 番目はクロージャのイテレータ、最後の引数は値を生成するクロージャです。Rでこのようなことは可能ですか?F# でいつも使用しています。

result <- GenerateVector(5, n, function(n){
    n*10
})

次のようになります。

result =
10
20
30
40
50
4

2 に答える 2

3

私のコメントに加えて、2 番目の引数が必要ない場合 (つまり、イテレータを指定する必要GenerateVector()がない場合)、次のように記述できます。

GenerateVector <- function(x, FUN) {
    do.call(FUN, list(seq_len(x)))
}

R> GenerateVector(5, FUN = function(n) {n*10})
[1] 10 20 30 40 50

それがより一般的に機能するかどうかFUNは、ベクトル化された関数(例のように)かどうかによって異なります。もちろん、ベクトルを受け入れない関数を使用すると、大幅な非効率が発生するため、これはおそらくそれほど大きな問題ではありません。

一般に、これらは通常の R 規則を使用して記述する方がはるかに簡単です。

R> 1:5 * 10
[1] 10 20 30 40 50
R> foo <- function(n) n * 10
R> foo(1:5)
[1] 10 20 30 40 50

do.call()の例では、上記の R コードの最後の 2 行を書いているだけです。

于 2012-09-07T13:19:18.970 に答える
1

おそらく次のようなsapplyことができます:

sapply(1:5, function(n)10*n)
[1] 10 20 30 40 50

類似点は、sapply入力としてリストを受け取り、そのリスト内の各要素に関数を適用し、結果をリストに返すことです。リスト自体がベクトルなので、入力ベクトルでも同じことができます。

この例では、:演算子を使用してベクトル シーケンスを作成します。

于 2012-09-07T13:18:56.160 に答える