如何在R中并排显示列表 - 列表的“cbind”?

时间:2012-02-09 15:42:22

标签: r list object

我希望使用我的屏幕空间来并排看几个简单的列表。我并没有尝试将它们组合起来,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个,而不会缩小到一个小字体。

如果它更容易,e3l1中的l2条目可以是"FOSS",以匹配l3$e3的字符向量,但是真正的目标是R控制台中的布局问题。

一些天真的,特定于界面的解决方案包括:

  • 使用GNU screenC-A |
  • 启动多个R实例,拆分屏幕
  • 学习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))

4 个答案:

答案 0 :(得分:5)

将一些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] "                                                                                                             "

答案 1 :(得分:3)

您可以使用gplots::textplot

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

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

答案 2 :(得分: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")

答案 3 :(得分:0)

为什么不使用unlist()?把它们欺骗成行?

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

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