R - gsub заменяет обратную косую черту

Я хотел бы использовать gsub для замены каждого появления обратного слэша в строке с помощью двух обратных косых черт.

В настоящее время я пробовал gsub("\\\\", "\\", x). Однако это не работает. Однако, если я заменю выражение вместо вместо каждой обратной косой черты на "a", она отлично работает.

> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"

Последний символ - это только одна обратная косая черта; R просто печатает 2, потому что он печатает экранированные символы с обратной косой чертой. Использование nchar подтверждает, что длина равна 1.

Что вызывает эту функцию? Второй аргумент gsub не является регулярным выражением, поэтому наличие 4 обратных косых черт в строковом литерале должно быть преобразовано в символ с двумя обратными слэшами. Еще меньше имеет смысл, что первый вызов gsub выше возвращает пустую строку.

Ответ 1

Вот что вам нужно:

gsub("\\\\", "\\\\\\\\", "\\")
[1] "\\\\"

Причина, по которой вам нужно четыре обратных слэша, чтобы представить один буквальный обратный слэш, заключается в том, что "\" является символом escape в обеих строках R и для механизма регулярных выражений, к которому вы в конечном счете передаете ваши шаблоны. Если вы разговаривали напрямую с движком регулярных выражений, вы должны использовать "\\", чтобы указать буквальную обратную косую черту. Но для того, чтобы заставить R передать "\\" на двигатель регулярных выражений, вам нужно ввести "\\\\".


(Если вы просто хотите удвоить обратную косую черту, вы можете использовать это вместо этого):

gsub("\\", "\\\\", "\\", fixed=TRUE)
[1] "\\\\"