2017-01-09 46 views
1

У меня есть именованный вектор символов, как это:печати имени вектор без заполнения

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

Я хочу напечатать его без кавычек, оставляя зазор 2 между значениями.

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

дает мне:

 a   b   c 
    1.000 10000.000  1.000 

Как можно видеть, все значения проложенный по ширине самого широкого значения. Я хотел бы напечатать его так, чтобы он выглядел следующим образом:

a   b  c 
1.000 10000.000 1.000 

Имена также могут быть длиннее. Например:

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

Это должно напечатать как:

aaaaaa   b ccccccc 
1.000 10000.000 1.000 

Я не вижу, как это может быть достигнуто с существующими функциями. Я написал этот уродливый взлом:

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) 

Любые предложения по более элегантному решению?

ответ

1

Обновлено: Исправлена ​​незначительная ошибка

Мое решение не так уж отличается от вашей, но избегает петель.

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