2016-03-21 6 views
0

Rでは、通常forループを使用して評価する必要がある2つのグリッドの計算を簡略化するためにouter()コマンドを使用できます。任意のiためx[i]*x[y]の出力がスカラーであるため、例えば、出力が行ベクトルの場合の外部コマンド

x = 1:10 
y = 1:10 

f = function(x,y){ 
    ans = x*y 
    return(ans) 
} 

outer(x,y,f) 

は今、これは動作します。しかし、x*yの出力がベクトルであった場合でも、同様の方法でouter()コマンドを適用できますか?例えば

、以下のようなもののためのベクトルであり、すべての出力を計算するouter()のような高速な方法があります:

x = 1:10 
y = 1:10 

f = function(x,y){ 
    ans = x*y+c(1,1,1) 
    return(ans) 
} 

outer(x,y,f) 

これらの例は、一種の些細ですが、私は私が持っている問題に取り組んでいますすべての可能な組み合わせを完了するために非常に多くの回数にわたってループしなければならない3つの埋め込みforループ。

+0

あなたのコードはエラーです。 '* +'はどういう意味ですか? – MichaelChirico

+0

あなたの期待する出力は? – MichaelChirico

+0

@MichaelChirico申し訳ありませんが、私はコピーして貼り付けたときにタイプミスでした。今修正されました。 – RustyStatistician

答えて

1

ないあなたが後にしているのかわからが、ここでのスタート(fと仮定すると、実際にx*y + rep(1,3)です):

do.call(mapply, c(f, expand.grid(x=x, y=y))) 
#  [,1] [,2] [,3] [,4] [,5] ... 
# [1,] 2 3 4 5 6 ... 
# [2,] 2 3 4 5 6 ... 
# [3,] 2 3 4 5 6 ... 

次の3つの次元の出力が必要な代わり場合は、simplify="array"sapplyを使用します。

sapply(x, function(xx) sapply(y, function(yy) f(xx, yy)), simplify = "array") 

# , , 1 
# 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] 2 3 4 5 6 7 8 9 10 11 
# [2,] 2 3 4 5 6 7 8 9 10 11 
# [3,] 2 3 4 5 6 7 8 9 10 11 
# ... 
関連する問題