2017-01-09 49 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