Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将向量的打印列与sprintf(R)对齐_C_R_Formatting - Fatal编程技术网

C 如何将向量的打印列与sprintf(R)对齐

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

假设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(){
    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     "