2013-10-16 17 views

cevap

9

expand.grid, giriş olarak list alabilir, peki ya replicate? bir fonksiyonu olarak eğlence için

expand.grid(replicate(3, v, simplify=FALSE)) 

, (ben bunu nasıl bilemez biliyorum gerçi):

new.expand.grid <- function(input, reps) { 
    expand.grid(replicate(reps, input, simplify = FALSE)) 
} 

new.expand.grid(c(1, 2), 4) 
# Var1 Var2 Var3 Var4 
# 1  1 1 1 1 
# 2  2 1 1 1 
# 3  1 2 1 1 
# 4  2 2 1 1 
# 5  1 1 2 1 
# 6  2 1 2 1 
# 7  1 2 2 1 
# 8  2 2 2 1 
# 9  1 1 1 2 
# 10 2 1 1 2 
# 11 1 2 1 2 
# 12 2 2 1 2 
# 13 1 1 2 2 
# 14 2 1 2 2 
# 15 1 2 2 2 
# 16 2 2 2 2 
+0

Harika! Bunu bu şekilde yapmayı pek düşünmedim! – nico

5

do.call bir argümanların bir dizi dinamik geçme standart yoludur fonksiyonu:

new.expand.grid <- function(vec,nrep) do.call(expand.grid,rep(list(vec),nrep)) 

Örnek: new.expand.grid(letters[1:2],4)

Var1 Var2 Var3 Var4 
1  a a a a 
2  b a a a 
3  a b a a 
4  b b a a 
5  a a b a 
6  b a b a 
7  a b b a 
8  b b b a 
9  a a a b 
10 b a a b 
11 a b a b 
12 b b a b 
13 a a b b 
14 b a b b 
15 a b b b 
16 b b b b 
+1

'do.call' hakkında alınan nokta, ama bence bu durumda çok fazla. expand.grid (rep (liste (v), 4)) yeterli olacaktır. Ben sadece 'rep' ve 'cevapları' yanıtlarımızın bir kısmını kıyaslamanın, 'rep' yaklaşımını daha hızlı bulacağını tahmin edebilirim. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Evet, sadece en uygun cevabı vermek yerine, söz konusu OP'nin tam olarak nasıl çağrılacağını düşünüyordum. :) – Frank

İlgili konular