簡體   English   中英

如何在 R 中並排顯示列表 - 列表的“cbind”?

[英]How to display lists side-by-side in R - a "cbind" for lists?

我希望使用我的屏幕空間並排查看幾個簡單的列表。 我並沒有嘗試將它們組合起來,a la cbind ,但我不介意是否創建了一個新的中間結構。 當然,要意識到一個列表可能有許多不同類型的對象,盡管我幾乎可以保證我的列表具有相同的結構; 如有必要,請隨意插入“NA”或“NULL”以使事情正常進行(或者我可以弄清楚如何解決這個問題)。

以下是我想並排顯示的三個示例列表:

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 個,除非字體變小。

如果它更容易, l1l2中的e3條目可以是"FOSS" ,以匹配l3$e3的字符向量,但真正的目標是 R 控制台中的布局問題。

一些簡單的、特定於接口的解決方案包括:

  • 啟動多個 R 實例,使用 GNU screenCA |
  • 學好ESS,讓Emacs的奇跡解決一切
  • 與另一個文本編輯器(例如Notepad++)來回並手動遷移文本塊

我正在嘗試的非天真的解決方案是:

  • 將這些寫到一個文本文件中。 這里的問題是計算固定寬度的間距。 也許read.fwf會有所幫助。 (如果條目超出分配的空間或截斷內容,則可以以錯誤停止。)
  • 嘗試使用reshape包。
  • 可能涉及xlsx的東西,創建一堆單元格,每個單元格都有文本條目,然后嘗試顯示一個大字符矩陣。

還有其他一些更有效的方法嗎? 同樣,沒有什么真正需要組合為一個對象,只需組合在視覺顯示中即可。


更新 1. 這是一個使用plyr的例子。 不可否認,結果非常粗糙——列表和列表元素的名稱沒有被保留 這並不難修復,但我懷疑有可能比這做得更好。 我可以像 R 通常打印的那樣打印列表,但以某種方式分隔窗口。 我懷疑這並不容易。

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

將一些capture.outputlapplygsubformat到一個容器中。 使用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] "                                                                                                             "

你可以使用gplots::textplot

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

它有助於最大化您的窗口。

這不是一個非常干凈的解決方案,但您可以將列表轉換為字符串,將它們放在兩個單獨的文件中,並調用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")
    a <- c("a", "b", "c")
    b <- c("1", "2", "3")

    for (i in 1:length(a)){
      cat(paste0(a[i] , " ", b[i]), sep = "\n")}'

輸出:
一個 1
乙二
3

為什么不使用unlist() 並欺騙他們成行?

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

如果您不喜歡e1 e2等,可以設置use.names=FALSE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM