2017-01-09 3 views
1

ich einen benannten Charakter Vektor wie diese:Drucke namens Vektor ohne Polsterung

x <- c(a="1.000", b="10000.000", c="1.000") 

ich es ohne Anführungszeichen ausdrucken möchte, eine Lücke von 2 zwischen den Werten zu verlassen.

print(x, quote=FALSE, print.gap=2) 

gibt mir:

 a   b   c 
    1.000 10000.000  1.000 

Wie zu sehen ist, werden alle Werte auf die Breite des breitesten Wert aufgefüllt. Ich möchte es so drucken, dass es so aussieht:

a   b  c 
1.000 10000.000 1.000 

Die Namen können auch länger sein. Zum Beispiel:

x <- c(aaaaaa="1.000", b="10000.000", ccccccc="1.000") 

Dies sollte drucken, wie:

aaaaaa   b ccccccc 
1.000 10000.000 1.000 

Ich sehe nicht, wie dies mit dem bestehenden Funktionen erreicht werden kann. Ich schrieb diesen hässlichen Hack:

fun <- function(x) { 

    len.n <- nchar(names(x)) 
    len.x <- nchar(x) 
    max.len <- pmax(len.n, len.x) 
    for (i in 1:length(x)) { 
     cat(rep(" ", (max.len - len.n)[i]), collapse="", sep="") 
     if (i > 1) 
     cat(" ") 
     cat(names(x)[i]) 
    } 
    cat("\n") 
    for (i in 1:length(x)) { 
     cat(rep(" ", (max.len - len.x)[i]), collapse="", sep="") 
     if (i > 1) 
     cat(" ") 
     cat(x[i]) 
    } 
    cat("\n") 

} 

x <- c(a="1.000", b="10000.000", c="1.000") 
fun(x) 
x <- c(aaaaaa="1.000", b="10000.000", ccccccc="1.000") 
fun(x) 

Irgendwelche Vorschläge für eine elegantere Lösung?

Antwort

1

Aktualisiert: Fest kleinere Fehler

Meine Lösung als Ihr nicht so verschieden ist, vermeidet aber die Schleifen.

NicePrint = function(x) { 
    NameW = nchar(names(x)) 
    ValW = nchar(x) 
    Width = pmax(NameW, ValW) 
    format = sapply(Width, function(x) paste("%", x, "s", sep="")) 

    L1 = paste(sprintf(format, names(x)), collapse=" ") 
    L2 = paste(sprintf(format, x), collapse=" ") 
    cat(L1, "\n", L2, "\n", sep="") 
} 

x <- c(a="1.000", b="10000.000", c="1.000") 
NicePrint(x) 
    a   b  c 
1.000 10000.000 1.000 

x <- c(aaaaaa="1.000", b="10000.000", ccccccc="1.000") 
NicePrint(x) 
aaaaaa   b ccccccc 
1.000 10000.000 1.000 
Verwandte Themen