Необработанные текстовые строки для путей к файлам в R - PullRequest
28 голосов
/ 20 ноября 2011

Можно ли использовать префикс при указании строки пути к файлу в R для игнорирования escape-символов?

Например, если я хочу прочитать в файле example.csv при использовании Windows, мне нужно вручную изменить\ до / или \\.Например,

'E:\DATA\example.csv'

становится

'E:/DATA/example.csv'

data <- read.csv('E:/DATA/example.csv')

В python Я могу использовать префикс моей строки, используя r, чтобы избежать этого (например, r'E:\DATA\example.csv').Есть ли подобная команда в R или подход, который я могу использовать, чтобы избежать этой проблемы.(Я перемещаюсь между Windows, Mac и Linux - это, очевидно, проблема только в ОС Windows).

Ответы [ 6 ]

38 голосов
/ 20 ноября 2011

Вы можете использовать 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\\"
7 голосов
/ 20 ноября 2011

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"

РЕДАКТИРОВАТЬ: Добавлена ​​дополнительная информация о normalizePath.

4 голосов
/ 20 ноября 2011

Немного другой подход, который я использую с пользовательской функцией, которая берет путь Windows и исправляет его для 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  

Но, как другие отметили, то, что вы хотите, не является действительно возможным.

3 голосов
/ 20 ноября 2011

Нет, это невозможно. К сожалению.

2 голосов
/ 27 июня 2017

Вот невероятно некрасивый хакер из одной строки, чтобы сделать это в базе 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"
1 голос
/ 01 февраля 2019

Чтобы ответить на актуальный вопрос «Могу ли я анализировать raw-строку в R без необходимости двойной обратной косой черты?» это хороший вопрос, и у него много применений, кроме конкретного варианта использования с буфером обмена.

Я обнаружил пакет, который обеспечивает эту функциональность:

https://github.com/trinker/pathr

Смотрите "win_fix". Вариант использования, указанный в документации, является именно тем случаем, который вы только что указали, однако я пока не исследовал, поддерживает ли он более гибкие сценарии использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...