Как использовать sprintf R для создания строк фиксированной ширины с заполнением пробелов в конце?

У меня есть вектор строк, и я хочу создать из него фиксированную строку. Более короткие строки должны быть заполнены пробелами. Например.:

c("fjdlksa01dada","rau","sjklf")
sprintf("%8s")
# returns
[1] "fjdlksa01dada" "     rau"      "   sjklf"

Но как я могу получить дополнительный пробел в конце строки?

Обратите внимание, что я слышал о write.fwf из пакета gdata, который действительно хорош, но в данном случае мало помогает, потому что мне нужно написать очень специфический нестандартный формат для устаревшей старой программы.


person Matt Bannert    schedule 13.02.2012    source источник


Ответы (3)


Добавьте минус перед 8, чтобы получить дополненную строку с выравниванием по левому краю.

person Bernd Elkemann    schedule 13.02.2012
comment
Верно, но не то, о чем просил ОП. - person Dirk Eddelbuettel; 13.02.2012
comment
Нет, это не так? Он пишет А как мне получить дополнительный пробел в КОНЦЕ строки? или я что-то путаю? - person Bernd Elkemann; 13.02.2012
comment
@DirkEddelbuettel ОП запросил пробел в конце, поэтому я думаю, что это подходит - person James; 13.02.2012
comment
Это именно то, что я хочу. Спасибо за помощь новичку в Си. Я могу +соответствовать только одному ответу, но поставил +1 к обоим. Спасибо за помощь и дополнительную информацию. - person Matt Bannert; 13.02.2012
comment
Вы правы - я неверно истолковал его пример. Он получил отступ слева, и я подумал, что он хотел отступ слева. Мой плохой, извините. Это был плохо сформулированный вопрос. - person Dirk Eddelbuettel; 13.02.2012
comment
@DirkEddelbuettel Он получил левое дополнение, и я подумал, что он хотел левое дополнение. Riiiighhhttt.... ;-) - person KomodoDave; 21.01.2014

Это скорее стандартный вопрос «C», чем вопрос R, поскольку он относится к строкам формата printf. Вы даже можете проверить это в командной строке:

edd@max:~$ printf "[% 8s]\n" foo
[     foo]
edd@max:~$ printf "[%-8s]\n" foo
[foo     ]
edd@max:~$ 

и в R это работает так же для заполнения слева:

R> vec <- c("fjdlksa01dada","rau","sjklf")
R> sprintf("% 8s", vec)
[1] "fjdlksa01dada" "     rau"      "   sjklf"     
R> 

и правильно

R> sprintf("%-8s", vec)
[1] "fjdlksa01dada" "rau     "      "sjklf   "     
R> 

Изменить: Обновлено, когда я лучше понял, о чем на самом деле просил @ran2.

person Dirk Eddelbuettel    schedule 13.02.2012
comment
Есть ли прямой способ добавить конечные 0 вместо пробелов, используя sprintf()? В настоящее время я оборачиваю результат в gsub(" ", "0", ...), что кажется немного громоздким. - person fdetsch; 20.01.2021

Пакет stringr предоставляет str_pad:

library(stringr)
x <- c("fjdlksa01dada","rau","sjklf")
str_pad(x, width=8, side="right")

который дает:

[1] "fjdlksa01dada" "rau     "      "sjklf   "
person Ryan C. Thompson    schedule 30.08.2016