在 R 中对齐打印字符串的标准工具是什么?

What are the standard tools to align printed strings in R?

这里是一系列cat语句

words = c("Hello","bar","ROCKnROLL","R","Supercalifragilisticexpialidocious")
for (i in 1:length(words))
{
    cat(paste0(words[i], "\t: ",nchar(words[i]),"\n"))
}

Hello   : 5
bar : 3
ROCKnROLL   : 9
R   : 1
Supercalifragilisticexpialidocious  : 34

我该怎么做才能像这样对齐它们

Hello                               : 5
bar                                 : 3
ROCKnROLL                           : 9
R                                   : 1
Supercalifragilisticexpialidocious  : 34

或者像这样

                             Hello  : 5
                               bar  : 3
                         ROCKnROLL  : 9
                                 R  : 1
Supercalifragilisticexpialidocious  : 34

或者最终像这样

             Hello                  : 5
              bar                   : 3
           ROCKnROLL                : 9
               R                    : 1
Supercalifragilisticexpialidocious  : 34

试试这个:

words = c("Hello","bar","ROCKnROLL","R","Supercalifragilisticexpialidocious")
for (i in 1:length(words)) {
  print(sprintf("%-40s:%d", words[i], nchar(words[i])))
}

输出:

[1] "Hello                                   :5"
[1] "bar                                     :3"
[1] "ROCKnROLL                               :9"
[1] "R                                       :1"
[1] "Supercalifragilisticexpialidocious      :34"

这基本上是一个固定宽度的文件。 base R没有这个功能(只有read.fwf),但是gdata::write.fwf会起作用

## create a data frame to write
words = c("Hello","bar","ROCKnROLL","R","Supercalifragilisticexpialidocious")
dat <- data.frame(words = words, sep = ':', nchar = nchar(words))

## write.fwf without a file name will print to the console
(co <- capture.output(gdata::write.fwf(dat, width = c(max(nchar(words)), 1, 3), justify = 'r'))[-1])
# [1] "                             Hello :   5" "                               bar :   3"
# [3] "                         ROCKnROLL :   9" "                                 R :   1"
# [5] "Supercalifragilisticexpialidocious :  34"

## cat it
cat(co, sep = '\n')

#                              Hello :   5
#                                bar :   3
#                          ROCKnROLL :   9
#                                  R :   1
# Supercalifragilisticexpialidocious :  34

您可以更改对齐方式以获得其他对齐方式

cat(capture.output(gdata::write.fwf(dat, width = c(max(nchar(words)), 1, 3), justify = 'c'))[-1], sep = '\n')
#               Hello                :   5
#                bar                 :   3
#             ROCKnROLL              :   9
#                 R                  :   1
# Supercalifragilisticexpialidocious :  34

cat(capture.output(gdata::write.fwf(dat, width = c(max(nchar(words)), 1, 3), justify = 'l'))[-1], sep = '\n')
# Hello                              :   5
# bar                                :   3
# ROCKnROLL                          :   9
# R                                  :   1
# Supercalifragilisticexpialidocious :  34