C 如何将向量的打印列与sprintf(R)对齐
假设R中有3个向量:C 如何将向量的打印列与sprintf(R)对齐,c,r,formatting,C,R,Formatting,假设R中有3个向量: x <- c("xskdlfl", " y", "lkjsf") y <- c(22.5, 6, 7.0) z <- c("slk","llkjdf", "xx") 如果R中没有大量杂乱的编程,我无法理解如何使用sprintf实现这一点。有没有一种简单的方法可以使用sprintf在R中实现这一点?如果使用“格式”,我希望能有一个好的sprintf教程的链接。提前感谢。您可以像在C中一样使用sprintf,方法如下: int main(){ ch
x <- c("xskdlfl", " y", "lkjsf")
y <- c(22.5, 6, 7.0)
z <- c("slk","llkjdf", "xx")
如果R中没有大量杂乱的编程,我无法理解如何使用sprintf实现这一点。有没有一种简单的方法可以使用sprintf在R中实现这一点?如果使用“格式”,我希望能有一个好的sprintf教程的链接。提前感谢。您可以像在C中一样使用sprintf,方法如下:
int main(){
char a[] = "azerty";
char b[] = "qsdfghjkl";
char c[] = "wxcvbn,;:!";
printf ("%-20s\t%20s\t%20s\n", a, b, c);
printf ("%-20s\t%20s\t%20s\n", b, c, a);
printf ("%-20s\t%20s\t%20s\n", c, a, b);
return 0;
}
不是很漂亮,但很有效:
mat = rbind(x, y, z)
for (i in 1:ncol(mat)) {
mat[, i] = format(mat[, i], justify = ifelse(i == 1, "left", "right"))
}
mat
# [,1] [,2] [,3]
# x "xskdlfl" " y" "lkjsf"
# y "22.5 " " 6" " 7"
# z "slk " "llkjdf" " xx"
row.names(mat) = NULL
noquote(mat)
# [,1] [,2] [,3]
# [1,] xskdlfl y lkjsf
# [2,] 22.5 6 7
# [3,] slk llkjdf xx
如果将向量定义为具有统一列内格式的列,而不是具有行内差异的行,那么它会变得更干净一些
x <- c("xskdlfl", " y", "lkjsf")
y <- c(22.5, 6, 7.0)
z <- c("slk","llkjdf", "xx")
(dat <- setNames(data.frame(rbind(x, y, z)), c('x','y','z')))
# x y z
# x xskdlfl y lkjsf
# y 22.5 6 7
# z slk llkjdf xx
with(dat, data.frame(x = sprintf(paste0('%-', max(nchar(x)), 's'), x), y, z))
# x y z
# 1 xskdlfl y lkjsf
# 2 22.5 6 7
# 3 slk llkjdf xx
这只是一个计算出多少的问题,在本例中是7,基于字符串的字符数
nchar
,我对R没有任何线索,但在C中,你可以使用printf族指定每个字段的宽度,右对齐或左对齐以及任何前导填充。这是在文档中进行的吗?或者您只是在谈论控制台输出?另外,sprintf
将对给定向量中的所有内容应用相同的格式。由于您的格式依赖于列,因此使用列向量比使用行向量更有意义。考虑到您对sprintf
教程的请求,example(sprintf)
有大量有用的示例建议abt列数据非常好的主意,我忽略了。需要阅读有关printf的更多信息才能了解如何设置列格式。我看过很多教程,大多数都有玩具示例,它们不涉及更复杂的数据结构。对sprintf的帮助并没有让我回答,但这是有问题的。就我一个人。为了配合OP,你需要一个转置。明白了。我一直盯着看,试图找出5.6是从哪里来的,以及我发现的最好的printf封面之一:
x <- c("xskdlfl", " y", "lkjsf")
y <- c(22.5, 6, 7.0)
z <- c("slk","llkjdf", "xx")
(dat <- setNames(data.frame(rbind(x, y, z)), c('x','y','z')))
# x y z
# x xskdlfl y lkjsf
# y 22.5 6 7
# z slk llkjdf xx
with(dat, data.frame(x = sprintf(paste0('%-', max(nchar(x)), 's'), x), y, z))
# x y z
# 1 xskdlfl y lkjsf
# 2 22.5 6 7
# 3 slk llkjdf xx
sprintf('%7s', z)
# [1] " slk" " llkjdf" " xx"
sprintf('%-7s', z)
# [1] "slk " "llkjdf " "xx "