不带填充打印命名向量
Print named vector without padding
我有一个这样命名的字符向量:
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)
对更优雅的解决方案有什么建议吗?
已更新:修复了小错误
我的解决方案与您的没有太大不同,但避免了循环。
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
我有一个这样命名的字符向量:
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)
对更优雅的解决方案有什么建议吗?
已更新:修复了小错误
我的解决方案与您的没有太大不同,但避免了循环。
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