2011-11-19 2 views
22

R에서 파일 경로 문자열을 이스케이프 문자를 무시하도록 지정할 때 접두사를 사용할 수 있습니까? 예를 들어 R의 파일 경로에 대한 원시 텍스트 문자열

나는 창을 사용할 때 파일 example.csv에 읽고 싶은 경우

, 내가 수동으로 / 또는 \\\을 변경해야합니다. 예를 들어,

'E:\DATA\example.csv' 

내가이 (예를 들어, r'E:\DATA\example.csv')를 수행하지 않도록 r를 사용하여 내 문자열을 앞에 수 python에서

'E:/DATA/example.csv' 

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

된다. R에 비슷한 명령이 있거나이 문제가 발생하지 않도록하기 위해 사용할 수있는 방법이 있습니까? (나는 윈도우, 맥과 리눅스 사이에서 움직인다 - 이것은 윈도우 OS에서의 명백한 문제이다).

+13

나는 r은 원시 문자열을 가지고 있었다 바랍니다. – hadley

+0

감사의 인사 -이 문제를 해결하는 방법에 대한 유용한 힌트가 많이 있습니다. @ Andrie 's를 답으로 표시했지만 G.Grothendieck의 솔루션이 유용하다는 것도 발견했습니다. – djq

+0

은 R에서 그와 비슷한 것을 갖기에 매우 좋을 것입니다. C#은 예를 들어 문자열에 @ 접두어를 제공합니다. @ \\ – Saar

답변

32

file.path을 사용하면 운영 체제와 상관없이 올바른 파일 경로를 구성 할 수 있습니다.


그러나 귀하의 질문에 직접 응답

zz <- file.path("E:", "DATA", "example.csv") 
normalizePath(zz) 
[1] "E:\\DATA\\example.csv" 
: 내가 인식하지 오전

file.path("E:", "DATA", "example.csv") 
[1] "E:/DATA/example.csv" 

normalizePath를 사용하여 운영 체제에 대한 표준 양식에 파일 경로를 변환하는 것도 가능합니다 즉, 나는 Windows에서 파일 경로를 복사하여 R에 직접 붙여 넣을 수 있다고 믿지 않는다.

Howeve r, 만약 당신이 정말로 후에 Windows 클립 보드에서 붙여 넣기 및 유효한 R 문자열을 얻는 방법입니다 readClipboard

예를 들어, Windows 탐색기에서 파일 경로를 복사 한 다음 다음 코드를 실행하십시오 E:\DATA\example.csv 클립 보드에있는 경우이 작업을 수행)

zz <- readClipboard() 
zz 
[1] "C:\\Users\\Andrie\\R\\win-library\\" 
+1

'readClipboard()'는 정말 수작업을 쉽게 해줍니다! 고맙습니다. – Nick

+0

은 enginer readClipboard를 리버스하고 op가 묻는 것을 수행하는 함수를 생성 할 수 있어야합니까? – Andreas

3

아니요, 불가능합니다. 죄송합니다.

+2

이 상황에 대해 두려워하지만, 나는 쓴 경험으로 R에서 불가능한 것을 결코 말하지 않는다는 것을 배웠습니다. – Andrie

+0

In : "c : \ temp \ file.csv" 이 경우 유일한 가능성은 R 소스 코드 중 일부에 상당한 변화가있는 것 같습니다. 파이썬의 원시 문자열처럼 구현할 수 있지만 문법을 조정해야합니다. 당신은 아마 물건을 깰거야 .... – Spacedman

+0

또 다른 가능성은 소스 필터의 일종 것입니다. 그러나 그것은 정말로 R이 아닐 것입니다. –

6

1 :

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() 

다음 file.choose 라인을 제외하고 (위) 그것이로 이동 1에서 계속)가 거기에 scan 문을 대체합니다.

3) Windows에서 read.csv의 경우 백 슬래시를 슬래시로 변경해야하지만 실제로 어떤 이유로 번역을해야한다면 파일이있는 경우 백 슬래시가 슬래시로 변환됩니다.

normalizePath(example.csv, winslash = "/") 

이러한 파일이 존재하지 않는 경우에도 슬래시 백 슬래시를 번역 : (아래의 다른 방법 중 하나를 사용할 수 있도록하지만, 그 다음 존재하지 않는 경우는 성가신 경고를 줄 것이다) :

gsub("\\", "/", example.csv, fixed = TRUE) 
## [1] "E:/DATA/example.csv" 
(210)

또는

chartr("\\", "/", example.csv) 
## [1] "E:/DATA/example.csv" 

편집 : normalizePath에 대한 자세한 정보를 추가했습니다. 나는 창문 패스를 받아 R.

pathPrep <- function() {       
    cat("Please enter the path:\\n\\n")   
    oldstring <- readline()      
    chartr("\\\\", "/", oldstring)    
}            

을 위해 그것을 수정하는 사용자 정의 만든 기능을 사용

+0

+1 이것이 내 대답에서 말한 것이기 때문에. 'normalizePath'는 파일이 존재하지 않는 경우에도 작동합니다.이 경우 경고가 발생합니다. – Andrie

+0

@ 앤드리, 예, 좋은 지적은 정말 경고입니다. –

3

약간 다른 접근 방식은 현실을 사용해보십시오!

이제 함수

shell.exec(x) #this piece would work only if  
       # this file really exists in the 
       # location specified 

에 공급할 수 번

(x <- pathPrep())      
C:/Users/Me/Desktop/SomeFolder/example.csv  

에 이르기까지 모든 콘솔을 사용하거나 Ctrl 키 + R로 경로를 붙여 메시지가 표시하지만 다른 사람들이 지적했듯이 당신이 원하는 것을 정말 가능하지 않습니다. (마음의 평화를 위해 suppressWarnings 사용) 따라서 자신의 작은 래퍼 함수에서

setwd(gsub(", ", "", toString(paste0(read.table("clipboard", sep="\\", stringsAsFactors=F)[1,], sep="/")))) 

사용 가능 :

+0

감사합니다. @Tyler, 아마도 해결 방법에 관심이 있다는 것을 분명히해야합니다. 그래서 이것은 매우 유용합니다. 나는 그것이 기본적으로 할 수 없다고 생각했다. – djq

+0

@celenius 내가 얼마 동안 그것을 원했기 때문에 당신이 원하는 것은 가능하다. :) 그러나 이것이 내가 얻을 수있는 가장 가까운 곳이었습니다. :( –

1

여기에 필요없는 패키지와 기본 R에서이 작업을 수행 할 수있는 매우 추악한 한 줄 해킹의

> 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" 
관련 문제