Необработанные текстовые строки для путей к файлам в R
Можно ли использовать префикс при указании строки пути файла в R, чтобы игнорировать escape-символы?
Например, если я хочу читать в файле example.csv
при использовании окон, мне нужно вручную изменить \
на /
или \\
. Например,
'E:\DATA\example.csv'
становится
'E:/DATA/example.csv'
data <- read.csv('E:/DATA/example.csv')
В python
я могу префикс моей строки, используя r
, чтобы избежать этого (например, r'E:\DATA\example.csv'
). Есть ли аналогичная команда в r
или подход, который я могу использовать, чтобы избежать этой проблемы. (Я перемещаюсь между окнами, mac и linux - это просто проблема с ОС Windows).
Ответы
Ответ 1
Вы можете использовать file.path
для создания правильного пути к файлу, независимо от операционной системы.
file.path("E:", "DATA", "example.csv")
[1] "E:/DATA/example.csv"
Также можно преобразовать путь к каноническому формату для вашей операционной системы, используя normalizePath
:
zz <- file.path("E:", "DATA", "example.csv")
normalizePath(zz)
[1] "E:\\DATA\\example.csv"
Но в прямой реакции на ваш вопрос: я не знаю, как игнорировать escape-последовательность, используя R. Другими словами, я не верю, что можно скопировать путь к файлу из Windows и вставить его прямо в R.
Однако, если вы действительно используете способ копирования и вставки из буфера обмена Windows и получения правильной строки R, попробуйте readClipboard
Например, если я скопирую путь к файлу из проводника Windows, запустите следующий код, я получаю допустимый путь к файлу:
zz <- readClipboard()
zz
[1] "C:\\Users\\Andrie\\R\\win-library\\"
Ответ 2
1) Если E:\DATA\example.csv
находится в буфере обмена, сделайте следующее:
example.csv <- scan("clipboard", what = "")
## Read 1 item
example.csv
## [1] "E:\\DATA\\example.csv"
Теперь вы можете скопировать "E:\\DATA\\example.csv"
из вышеуказанного вывода выше в буфер обмена и затем вставить его в исходный код, если вам нужно жестко закодировать путь.
Аналогичные замечания применяются, если E:\DATA\example.csv
находится в файле.
2) Если файл существует, попробуйте еще одну вещь:
example.csv <- file.choose()
а затем перейдите к нему и продолжите, как в 1) выше (кроме строки file.choose
заменяет там инструкцию scan
).
3) Обратите внимание, что это неверно, что вам нужно изменить обратную косую черту для перекоса косых черт для read.csv
в Windows, но если по какой-то причине вам действительно нужно выполнить этот перевод, то, если файл существует, это будет переводить обратную косую черту вперед косые черты (но если этого не существует, это даст раздражающее предупреждение, поэтому вы можете использовать один из других подходов ниже):
normalizePath(example.csv, winslash = "/")
и они переводят обратную косую черту вперед, если файл не существует:
gsub("\\", "/", example.csv, fixed = TRUE)
## [1] "E:/DATA/example.csv"
или
chartr("\\", "/", example.csv)
## [1] "E:/DATA/example.csv"
EDIT: добавлена дополнительная информация о normalizePath
.
Ответ 3
Несколько иной подход, который я использую с пользовательской функцией, которая принимает путь к окну и исправляет его для R.
pathPrep <- function() {
cat("Please enter the path:\\n\\n")
oldstring <- readline()
chartr("\\\\", "/", oldstring)
}
Попробуйте!
При запросе вставьте путь в консоль или используйте ctrl + r на все сразу
(x <- pathPrep())
C:/Users/Me/Desktop/SomeFolder/example.csv
Теперь вы можете передать его функции
shell.exec(x) #this piece would work only if
# this file really exists in the
# location specified
Но, как другие указывали, что вы хотите, поистине невозможно.
Ответ 4
Нет, это невозможно. К сожалению.
Ответ 5
Здесь невероятно уродливый однострочный взлом для этого в базе R, без пакетов:
setwd(gsub(", ", "", toString(paste0(read.table("clipboard", sep="\\", stringsAsFactors=F)[1,], sep="/"))))
Используется в своей собственной маленькой функции-обертки (используя suppressWarnings
для спокойствия):
> getwd()
[1] "C:/Users/username1/Documents"
> change_wd=function(){
+ suppressWarnings(setwd(gsub(", ", "", toString(paste0(read.table("clipboard", sep="\\", stringsAsFactors=F)[1,], sep="/")))))
+ getwd()
+ }
Теперь вы можете запустить его:
#Copy your new folder path to clipboard
> change_wd()
[1] "C:/Users/username1/Documents/New Folder"
Ответ 6
Чтобы ответить на актуальный вопрос "Могу ли я анализировать raw-string в R без необходимости двойной обратной косой черты?" это хороший вопрос, и у него много применений, кроме конкретного варианта использования с буфером обмена.
Я нашел пакет, который, кажется, обеспечивает эту функциональность:
https://github.com/trinker/pathr
Смотрите "win_fix". Вариант использования, указанный в документации, является именно тем случаем, который вы только что указали, однако я пока не исследовал, поддерживает ли он более гибкие сценарии использования.