2015-09-06 5 views
2

Базовые функции R paste и paste0 позволяют объединять строки (по-видимому, называемые символами в R).Как конкатенировать строку для каждого элемента возможного пустого символа символа?

Например:

>new_people <- c(" R. A. Becker", "J. M. Chambers", "A. R. Wilks") 
>paste0("Hello ",new_people,"!") 
[1] "Hello R. A. Becker!" "Hello J. M. Chambers!" "Hello A. R. Wilks!" 

Однако если один аргументы имеет нулевой длины (character()) он ведет себя непоследовательно и неожиданное (для меня):

> new_people <- character() 
> paste0("Hello ",new_people,"!") 
[1] "Hello !" 

Такое поведение описывается (но не мотивированный) в ?paste:

Векторные аргументы перерабатываются как нуждающиеся d, причем аргументы с нулевой длиной возвращаются в "". [...] Ценность: Символьный вектор объединенных значений. Это будет иметь длину, равную нулю, если все объекты есть, если коллапс не является NULL, и в этом случае это единственная пустая строка.

Если вы не можете найти его «несовместимым» еще представьте себе ответ на Equivalent of R's paste command for vector of numbers in Python что бы действительно воспроизвести поведение paste «s.

Чтобы избежать загромождения моего кода, я безуспешно искал альтернативную функцию или параметр для paste, который будет только перерабатывать аргументы длины 1. Даже функция str_c в пакете @ hadley's stringr обеспечивает такое поведение.

Есть ли альтернатива для вставки (и paste0), которая ведет себя согласованно w.r.t. аргументы нулевой длины (т. е. возвращает вектор символов нулевой длины в этом случае и пустую строку, если collapse не NULL)?

ответ

1

Во время написания этого вопроса я нашел почти удовлетворительный ответ:

> new_people <- c(" R. A. Becker", "J. M. Chambers", "A. R. Wilks") 
> sprintf("Hello %s!",new_people) 
[1] "Hello R. A. Becker!" "Hello J. M. Chambers!" "Hello A. R. Wilks!" 
> new_people <- character() 
> sprintf("Hello %s!",new_people) 
character(0) 

Это, однако, не хватает хорошую связи между переменным и их позицией в строке, что paste имеет и требует дополнительного окружающих paste(..., collapse="~"), если один хочет сливать струны вместе.