Подтвердить что ты не робот

Необработанные текстовые строки для путей к файлам в 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).

4b9b3361

Ответ 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". Вариант использования, указанный в документации, является именно тем случаем, который вы только что указали, однако я пока не исследовал, поддерживает ли он более гибкие сценарии использования.