2012-09-20 9 views
16

मेरे पास एक ऐसा फ़ंक्शन है जिसमें दो सूचियों पर लूप होता है और कुछ गणना डेटा बनाता है। मैं इन आंकड़ों को कुछ मूल्यों से अनुक्रमित सूचियों की सूचियों के रूप में वापस करना चाहता हूं, लेकिन मुझे असाइनमेंट गलत मिल रहा है।आर में एक लूप में एक सूची बनाना - आइटम नाम सही हो रहा है

मुझे क्या करना है कोशिश कर रहा हूँ, और मैं कहाँ गलत जा रहा हूँ होगा की एक न्यूनतम उदाहरण:

mybiglist <- list() 
for(i in 1:5){ 
    a <- runif(10) 
    b <- rnorm(16) 
    c <- rbinom(8, 5, i/10) 
    name <- paste('item:',i,sep='') 
    tmp <- list(uniform=a, normal=b, binomial=c) 
    mybiglist[[name]] <- append(mybiglist, tmp) 
} 

आप इस चलाने के लिए और उत्पादन mybiglist को देखें, तो आपको लगता है कि कुछ है देखेंगे जिस तरह से प्रत्येक आइटम का नाम दिया जा रहा है, उसमें बहुत गलत हो रहा है।

कोई विचार है कि मैं वास्तव में क्या हासिल कर सकता हूं?

धन्यवाद

ps। मैं जानता हूँ कि आर में वहाँ एक भावना है, जिसमें एक अगर एक छोरों का सहारा लेना पड़ता है में नाकाम रही है यह है कि, लेकिन इस मामले में मैं उचित लग रहा है ;-)

+4

'c' किसी ऑब्जेक्ट को नाम देने की अच्छी बात नहीं है !! – BenBarnes

+0

दरअसल ... बिंदु ले लिया! Thx – Hassantm

उत्तर

31

यह काम करता है अगर आप append आदेश का उपयोग नहीं करते हैं:

mybiglist <- list() 
for(i in 1:5){ 
    a <- runif(10) 
    b <- rnorm(16) 
    c <- rbinom(8, 5, i/10) 
    name <- paste('item:',i,sep='') 
    tmp <- list(uniform=a, normal=b, binomial=c) 
    mybiglist[[name]] <- tmp 
} 

# List of 5 
# $ item:1:List of 3 
# ..$ uniform : num [1:10] 0.737 0.987 0.577 0.814 0.452 ... 
# ..$ normal : num [1:16] -0.403 -0.104 2.147 0.32 1.713 ... 
# ..$ binomial: num [1:8] 0 0 0 0 1 0 0 1 
# $ item:2:List of 3 
# ..$ uniform : num [1:10] 0.61 0.62 0.49 0.217 0.862 ... 
# ..$ normal : num [1:16] 0.945 -0.154 -0.5 -0.729 -0.547 ... 
# ..$ binomial: num [1:8] 1 2 2 0 2 1 0 2 
# $ item:3:List of 3 
# ..$ uniform : num [1:10] 0.66 0.094 0.432 0.634 0.949 ... 
# ..$ normal : num [1:16] -0.607 0.274 -1.455 0.828 -0.73 ... 
# ..$ binomial: num [1:8] 2 2 3 1 1 1 2 0 
# $ item:4:List of 3 
# ..$ uniform : num [1:10] 0.455 0.442 0.149 0.745 0.24 ... 
# ..$ normal : num [1:16] 0.0994 -0.5332 -0.8131 -1.1847 -0.8032 ... 
# ..$ binomial: num [1:8] 2 3 1 1 2 2 2 1 
# $ item:5:List of 3 
# ..$ uniform : num [1:10] 0.816 0.279 0.583 0.179 0.321 ... 
# ..$ normal : num [1:16] -0.036 1.137 0.178 0.29 1.266 ... 
# ..$ binomial: num [1:8] 3 4 3 4 4 2 2 3 
+1

आह ... मुझे 3 सेकंड से हराया! – seancarmody

+0

वह करीब था ... –

+0

क्षमा करें मुझे वह याद आया! धन्यवाद दोनों! – Hassantm

4

बदलें

mybiglist[[name]] <- append(mybiglist, tmp) 

mybiglist[[name]] <- tmp 
+1

धन्यवाद शॉन ... यह चाल है! – Hassantm

1

को दिखाने के लिए एक expli कि पाश के लिए सीआईटी

unif_norm <- replicate(5, list(uniform = runif(10), 
    normal = rnorm(16)), simplify=F) 

binomials <- lapply(seq_len(5)/10, function(prob) { 
list(binomial = rbinom(n = 5 ,size = 8, prob = prob))}) 

biglist <- setNames(mapply(c, unif_norm, binomials, SIMPLIFY = F), 
        paste0('item:',seq_along(unif_norm))) 

की आवश्यकता नहीं है सामान्य तौर पर अगर आप for पाश पथ नीचे जाना यह पहले से सूची preassign बेहतर है। यह अधिक स्मृति कुशल है।

mybiglist <- vector('list', 5) 
names(mybiglist) <- paste0('item:', seq_along(mybiglist)) 
for(i in seq_along(mybiglist)){ 
    a <- runif(10) 
    b <- rnorm(16) 
    c <- rbinom(8, 5, i/10) 

    tmp <- list(uniform=a, normal=b, binomial=c) 
    mybiglist[[i]] <- tmp 
} 
+0

धन्यवाद ... हालांकि मैं वास्तव में वर्दी, सामान्य और द्विपक्षीय वितरण की सूचियां नहीं बनाना चाहता हूं ;-) यह नामकरण सम्मेलन था जिसके बाद मैं था। – Hassantm

+0

कम से कम preallocate याद रखना! – mnel

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^