2012-02-09 16 views
5

मैं अपनी स्क्रीन रीयल एस्टेट का उपयोग करके कई सरल सूचियों को देखने के लिए देख रहा हूं। मैं उन्हें गठबंधन करने की कोशिश नहीं कर रहा हूं, एक ला cbind, लेकिन अगर कोई नई मध्यवर्ती संरचना बनाई गई तो मुझे कोई फर्क नहीं पड़ता। बेशक, यह समझें कि एक सूची में कई अलग-अलग प्रकार की वस्तुएं हो सकती हैं, हालांकि मैं लगभग गारंटी दूंगा कि मेरी सूचियों में समान संरचनाएं हैं; चीजों को काम करने के लिए आवश्यक होने पर "एनए" या "न्यूल" डालने के लिए स्वतंत्र महसूस करें (या मैं यह समझ सकता हूं कि इसे कैसे घुमाया जाए)।आर में साइड-बाय-साइड सूचियों को कैसे प्रदर्शित करें - सूचियों के लिए "cbind"?

यहाँ तीन उदाहरण सूचीबद्ध करता है कि मैं कंधे से कंधा मिलाकर प्रदर्शित करने का प्रयास करना चाहते हैं:

l1 <- list(e1 = "R", e2 = list("statistics", "visualization"), e3 = 0) 
l2 <- list(e1 = "Perl", e2 = list("text processing", "scripting"), e3 = 0) 
l3 <- list(e1 = "Matlab", e2 = list("numerical computing", "simulation"), e3 = c("academic - unknown", "professional - unknown")) 

आप एक विस्तृत मॉनिटर है, तो यह एक बेकार की तरह दिखता है इन इतना खड़ी कक्ष तक ले देखने के लिए और क्षैतिज पहुंच पर इतना छोटा कमरा इस्तेमाल किया जाता है। यदि ये सूचियां थोड़ी देर तक थीं, तो मैं एक छोटे से फ़ॉन्ट को कम किए बिना, एक समय में 2 से अधिक नहीं देख पाऊंगा।

यह यह आसान, l1 में e3 प्रविष्टियों और l2"FOSS", l3$e3 के चरित्र वैक्टर मिलान करने के लिए किया जा सकता है बनाता है, लेकिन असली लक्ष्य आर कंसोल में एक स्वरूप की समस्या है।

कुछ अनुभवहीन, इंटरफ़ेस-विशिष्ट समाधान में शामिल हैं:

  • आग तक अनेक आर उदाहरणों, विभाजित स्क्रीन जीएनयू screen और C-A |
  • जानें ईएसएस, और Emacs का चमत्कार सब कुछ का समाधान करते हैं का उपयोग कर
  • जाओ एक और पाठ संपादक (जैसे नोटपैड ++) के साथ आगे और आगे पाठ के ब्लॉक

गैर-निष्पक्ष समाधान टी टोपी मैं कोशिश कर रहा हूं:

  • इन्हें एक टेक्स्ट फ़ाइल में लिखें। यहां समस्या निश्चित चौड़ाई दूरी का काम कर रही है। शायद read.fwf मदद करेगा। (यदि कोई प्रविष्टि आवंटित स्थान से अधिक हो, या सामान को छोटा करने के लिए त्रुटि हो तो ठीक है।)
  • reshape पैकेज के साथ कुछ करने का प्रयास करें।
  • संभावित रूप से कुछ xlsx शामिल है, कोशिकाओं का एक समूह बनाने के लिए, प्रत्येक पाठ प्रविष्टियों के साथ, और फिर एक बड़ा चरित्र मैट्रिक्स प्रदर्शित करने का प्रयास करें।

क्या कुछ अन्य विधियां हैं जो अधिक कुशल होंगी? फिर, कुछ भी वास्तव में किसी ऑब्जेक्ट के रूप में संयुक्त होने की आवश्यकता नहीं है, केवल दृश्य प्रदर्शन में संयुक्त है।


अपडेट 1. यहां plyr का उपयोग करके एक उदाहरण दिया गया है। परिणाम स्वीकार्य रूप से काफी कच्चे हैं - सूचियों और सूची तत्वों के नाम संरक्षित नहीं किए गए हैं, इसे ठीक करना मुश्किल नहीं है, लेकिन मुझे संदेह है कि इससे बेहतर प्रदर्शन करना संभव है। मैं सूचियों को प्रिंट करने के साथ ठीक हूं क्योंकि आर सामान्य रूप से उन्हें प्रिंट करता है, लेकिन खिड़की को किसी भी तरह से अलग करता है। मुझे संदेह है कि यह आसान नहीं है।

combineLists <- function(manyLists){ 
    library(plyr) 
    newLists <- list() 
    for(ixList in 1:length(manyLists)){ 
     tmpList <- lapply(manyLists[[ixList]], paste, sep = "", collapse = ", ") 
     tmpVec <- as.character(tmpList) 
     newLists[[ixList]] <- tmpVec 
    } 
    newDF <- t(ldply(newLists)) 
    return(newDF) 
} 

combineLists(list(l1, l2, l3)) 

उत्तर

5

एक कंटेनर में कुछ capture.output, lapply, gsub और format कम्बाइन। बाध्यकारी एजेंट के रूप में do.call का उपयोग करें। स्वाद के लिए paste जोड़ें। यह कुछ समय के लिए शराब बनाना है:

sidebyside <- function(..., width=60){ 
    l <- list(...) 
    p <- lapply(l, function(x){ 
     xx <- capture.output(print(x, width=width)) 
     xx <- gsub("\"", "", xx) 
     format(xx, justify="left", width=width) 
     } 
) 
    p <- do.call(cbind, p) 
    sapply(seq_len(nrow(p)), function(x)paste(p[x, ], collapse="")) 
} 

यह इलाज सब कुछ होगा:

sidebyside(l1, l2, l3, width=30) 

[1] "$e1       $e1       $e1            " 
[2] "[1] R       [1] Perl      [1] Matlab          " 
[3] "                            " 
[4] "$e2       $e2       $e2            " 
[5] "$e2[[1]]      $e2[[1]]      $e2[[1]]           " 
[6] "[1] statistics    [1] text processing   [1] numerical computing       " 
[7] "                            " 
[8] "$e2[[2]]      $e2[[2]]      $e2[[2]]           " 
[9] "[1] visualization    [1] scripting     [1] simulation         " 
[10] "                            " 
[11] "                            " 
[12] "$e3       $e3       $e3            " 
[13] "[1] 0       [1] 0       [1] academic - unknown  professional - unknown" 
[14] "                            " 
+0

+1 यह अच्छा लग रहा है! – Iterator

+0

आपका उत्तर वह है जो मैं आधार आर में प्राप्त करने की उम्मीद कर रहा था। जेम्स का जवाब वास्तव में मुझसे अधिक आकर्षक है जितना कि मुझे उम्मीद की जा सकती है, लेकिन आपका बेस आर समाधान "कंसोल" पुरस्कार जीतता है (बनाम सांत्वना ...)। – Iterator

2

एक बहुत साफ समाधान नहीं है यही कारण है, लेकिन आप तार करने के लिए सूचियों परिवर्तित कर सकते हैं, उन्हें दो अलग-अलग फ़ाइलें, और diff -y (या किसी भी इसी तरह के आवेदन) फोन के बीच मतभेदों को प्रदर्शित करने के लिए में डाल दो फाइलें प्रदान की गई संरचनाएं बहुत समान हैं, वे गठबंधन होंगे।

cat(capture.output(print(l1)), sep="\n", file="tmp1") 
cat(capture.output(print(l2)), sep="\n", file="tmp2") 
system("diff -y tmp1 tmp2") 
+0

+1 मुझे यह पसंद है। 'Diff' को साइड-बाय-साइड प्रेजेंटेशन प्रबंधित करना चालाक है। 'diff' कार्यक्षमता काफी उपयोगी है। अगर कोई सबकुछ चाहता था, तो उस स्रोत के लिए अद्वितीय टोकन के साथ हर पंक्ति को प्रीपेड करना मुश्किल नहीं है (यानी मूल सूची)। मुझे केवल संदेह है कि> 2 सूचियां इतनी अच्छी तरह से काम नहीं कर पाएंगी। – Iterator

+0

आपका विचार 'पेस्ट' कमांड का उपयोग करके भी बढ़ाया जा सकता है। हालांकि, विभिन्न फाइलों की चौड़ाई परिणाम को झुका देती है। यह मुझे कुछ प्रकार की निश्चित चौड़ाई + स्ट्रिंग ट्रंकेशन/पैडिंग के साथ आर के माध्यम से चीजों को संयोजित करने के लिए वापस ले जाता है। यह अभी भी 'capture.output()' का उपयोग करेगा, जो एक अच्छा विचार है, और सूची वस्तुओं की झुकाव के बजाय * प्रदर्शन * पर केंद्रित है। – Iterator

0

unlist() का उपयोग क्यों नहीं? और उन्हें पंक्तियों में धोखा दे?

library(gplots) 
textplot(cbind(l1,l2,l3)) 

यह पहली बार अपने विंडो को अधिकतम करने में मदद करता है:

for(x in 1:3) { 
print(rbind(unlist(get(paste("l",x,sep=""))))) 
} 

आप

+0

यह दिलचस्प है, लेकिन मेरी स्क्रीन * वह * चौड़ी नहीं है। :) कुछ पाठ खत्म हो जाएगा। पंक्तियों के बजाए, इस कॉलम को फ़िट करना, प्रक्रिया करना आसान होगा। – Iterator

+0

cbind() प्रत्येक तत्व में वैक्टर> 1 है, तो असूची के साथ बहुत अच्छी तरह से काम नहीं करता है। –

3

आप gplots::textplot इस्तेमाल कर सकते हैं use.names=FALSE सेट करता है, तो आप पसंद नहीं करते E1 E2 आदि सकता है।

+0

+1 यह भी काफी अच्छा है - यह एक स्पष्ट, उपयोगी प्रदर्शन भी है। 'Mar' और' cex' के विकल्प आसान लगते हैं। – Iterator

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