2016-03-21 22 views
0

Bu yüzden, R'da, genellikle değerlendirilecek bir for döngüsü kullanmak zorunda olan değerlerin iki ızgarası üzerinden hesaplamaları basitleştirmek için outer() komutunu kullanabilirsiniz. herhangi i için x[i]*x[y] çıktısı sayıl olduğundan Örneğin,Çıktı bir satır vektörü olduğunda dış komut

x = 1:10 
y = 1:10 

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

outer(x,y,f) 

Şimdi, bu çalışır. Ancak, x*y çıktısı bir vektör ise, outer() komutunu benzer şekilde uygulayabilirsiniz?

x = 1:10 
y = 1:10 

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

outer(x,y,f) 

Bu örnekler tür önemsiz ama ben var bir sorun üzerinde çalışıyorum:

Örneğin

aşağıdaki gibi bir şey için vektörler olan tüm çıkışlar hesaplamak için outer() gibi hızlı bir yolu vardır Her olası kombinasyonu tamamlamak için çok fazla sayıda döngü yapmak zorunda olan üç gömülü for döngüsü.

+0

kodunuz bir hata. "* +" Ile ne demek istiyorsun? – MichaelChirico

+0

Beklenen çıktınız nedir? – MichaelChirico

+0

@MichaelChirico üzgünüm evet, kopyalayıp yapıştırdığımda yazım hatası oldu. Şimdi sabit. – RustyStatistician

cevap

1

burada ne sonra, ama (f aslında x*y + rep(1,3) olduğunu varsayarak) bir başlangıç ​​katacaktır Değil:

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 ... 

üç boyutlu çıktı, kullanmak istediğiniz Bunun yerine sapplysimplify="array" ile:

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 
# ... 
İlgili konular