[英]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 個,除非字體變小。
如果它更容易, l1
和l2
中的e3
條目可以是"FOSS"
,以匹配l3$e3
的字符向量,但真正的目標是 R 控制台中的布局問題。
一些簡單的、特定於接口的解決方案包括:
screen
和CA |
我正在嘗試的非天真的解決方案是:
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.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] " "
你可以使用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")
為什么不使用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.