Игнорировать escape-символы (обратную косую черту) в строках R - PullRequest
19 голосов
/ 14 января 2011

При запуске R-плагина в SPSS я получаю строку пути Windows в качестве ввода, например,

'C:\Users\mhermans\somefile.csv'

Я хотел бы использовать этот путь в последующем R-коде, но затем слэш необходимо заменить на прямой, в противном случае R интерпретирует его как escape-символы (например, ошибки "\ U used with hex hexits").

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

Итак, есть ли что-то вроде:

>gsub('\\', '/', 'C:\Users\mhermans')
C:/Users/mhermans

Ответы [ 3 ]

14 голосов
/ 14 января 2011

Вы можете попробовать использовать аргумент allowEscapes в scan ()

X=scan(what="character",allowEscapes=F)
C:\Users\mhermans\somefile.csv

print(X)
[1] "C:\\Users\\mhermans\\somefile.csv"
4 голосов
/ 14 января 2011

Сначала вам нужно присвоить его имени:

pathname <- 'C:\\Users\\mhermans\\somefile.csv'

Обратите внимание, что для того, чтобы поместить его в вектор имен, вам необходимо удвоить их все, что дает подсказку о том, как вы могли бы использоватьрегулярное выражение.На самом деле, если вы прочитаете это из текстового файла, тогда R сделает все удвоения за вас.Имейте в виду, это не на самом деле удвоение обратного слеша.Он хранится как одна обратная косая черта, но он отображается так, и его необходимо вводить с консоли.В противном случае интерпретатор R пытается (и часто не может) превратить его в специальный символ.И чтобы усугубить проблему, регулярное выражение также использует обратную косую черту как побег.Таким образом, чтобы обнаружить побег с помощью grep, sub или gsub, вам нужно в четыре раза увеличить обратную косую черту

 gsub("\\\\", "/", pathname)
# [1] "C:/Users/mhermans/somefile.csv"

Вам нужно было вдвое «удвоить» обратную косую черту.Первая из каждой пары должна сигнализировать машине grep о том, что следующее - это литерал.

Рассмотрим:

 nchar("\\A")
#  returns `[1] 2`
1 голос
/ 14 января 2011

Если файл E: \ Data \ junk.txt содержит следующий текст (без кавычек): C: \ Users \ mhermans \ somefile.csv

Вы можете получить предупреждение со следующим утверждением, но онобудет работать:

 texinp <- readLines("E:\\Data\\junk.txt")

Если файл E: \ Data \ junk.txt содержит следующий текст (с кавычками): "C: \ Users \ mhermans \ somefile.csv"

приведенное выше выражение readlines может также дать вам предупреждение, но теперь оно будет содержать:

"\" C: \ Users \ mhermans \ somefile.csv \ ""

Итак, чтобы получить то, что вы хотите, убедитесь, что во входящем файле нет кавычек, и используйте:

 texinp <- suppressWarnings(readLines("E:\\Data\\junk.txt"))
...