2016-08-22 12 views
6

listesi, tüm kombinasyonların ürünleri hesaplayın. Örneğin, a'daki ilk nesne 3 4 5 6, yani ilk nesnenin tüm ürünleri 12 15 18 20 24 30 ve ikinci nesnenin tüm ürünleri 42 48 56'dur. AMAÇ, nesnede sadece bir eleman olduğunda, çıktı 0 olmalıdır. Sorunu Map(function(x) combn(x,2,prod),a) kullanarak çözmeyi planlıyorum, ancak nesnede yalnızca bir öğe olduğunda (a'daki 4. nesne gibi) uygun değildi.R aşağıdaki gibi <code>a</code> olan

> Map(function(x) combn(x,2,prod),a) 
[[1]] 
[1] 12 15 18 20 24 30 

[[2]] 
[1] 42 48 56 

[[3]] 
[1] 12 

[[4]] 
[1] 2 3 4 5 6 7 8 6 8 10 12 14 16 12 15 18 21 24 20 24 28 32 30 35 40 42 48 56 

Peki nasıl her nesnede tüm kombinasyonların hepsi 2-eleman ürünleri almak ve aynı anda yalnızca tek bir öğe olduğunda, 0 alabilirim? Teşekkürler! aşağıdaki gibi

Benim beklenen bir sonuçtur:

[[1]] 
[1] 12 15 18 20 24 30 

[[2]] 
[1] 42 48 56 

[[3]] 
[1] 12 

[[4]] 
[1] 0 

cevap

6

Yaklaşımınızı kullanın ve sarın combn:

a<-list(3:6,6:8,3:4,8) 
combn2 <- function(x, ...) 
    if(length(x) == 1L) 0 else combn(x, ...) 
Map(function(x) combn2(x,2,prod),a) 
#[[1]] 
#[1] 12 15 18 20 24 30 
# 
#[[2]] 
#[1] 42 48 56 
# 
#[[3]] 
#[1] 12 
# 
#[[4]] 
#[1] 0 
3

Biz if/else koşulu

Map(function(x) if(length(x)==1) 0 else combn(x,2, FUN = prod),a) 
#[[1]] 
#[1] 12 15 18 20 24 30 

#[[2]] 
#[1] 42 48 56 

#[[3]] 
#[1] 12 

#[[4]] 
#[1] 0 

Beraber deneyebilirsiniz düşün (Ben onun cevabını görmedik gerçi, 9 saniye benden önce) arazi önce bunu cevap nedenle yukarıdaki bir varyasyonu

ifelse(lengths(a)==1, 0, Map(function(x) combn(x, 2, prod), a)) 

Veya ile lapply

ifelse(lengths(a)==1, 0, lapply(a, function(x) combn(x, 2, FUN = prod))) 
İlgili konular