2011-11-19 58 views
22

Có thể sử dụng tiền tố khi chỉ định chuỗi filepath trong R để bỏ qua ký tự thoát không?Chuỗi văn bản thô cho đường dẫn tệp trong R

Ví dụ: nếu tôi muốn đọc trong tệp example.csv khi sử dụng cửa sổ, tôi cần phải thay đổi thủ công \ thành / hoặc \\. Ví dụ,

'E:\DATA\example.csv' 

trở thành

'E:/DATA/example.csv' 

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

Trong python tôi có thể thêm tiền tố chuỗi của tôi sử dụng r để tránh làm điều này (ví dụ r'E:\DATA\example.csv'). Có một lệnh tương tự trong R hoặc phương pháp tiếp cận mà tôi có thể sử dụng để tránh gặp sự cố này không. (Tôi di chuyển giữa các cửa sổ, mac và linux - đây chỉ là một vấn đề trên hệ điều hành windows rõ ràng).

+13

tôi muốn r đã có chuỗi thô. – hadley

+0

Cảm ơn mọi người - rất nhiều gợi ý hữu ích về cách giải quyết vấn đề này. Tôi đã đánh dấu @ Andrie là câu trả lời, nhưng tôi cũng tìm thấy giải pháp của G.Gothothieck hữu ích. – djq

+0

sẽ rất tuyệt khi có một cái gì đó như thế trong R. C# ví dụ cung cấp tiền tố @ cho chuỗi, ví dụ: @ "c: \ temp \ file.csv" sẽ dẫn đến việc thoát khỏi \ to \\ – Saar

Trả lời

32

Bạn có thể sử dụng file.path để tạo đường dẫn tệp chính xác, độc lập với hệ điều hành.

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

Nó cũng có thể chuyển đổi một đường dẫn tập tin với hình thức kinh điển cho hệ điều hành của bạn, sử dụng normalizePath:

zz <- file.path("E:", "DATA", "example.csv") 
normalizePath(zz) 
[1] "E:\\DATA\\example.csv" 

Nhưng trong phản ứng trực tiếp cho câu hỏi của bạn: Tôi không biết một cách để bỏ qua chuỗi thoát bằng R. Nói cách khác, tôi không tin rằng có thể sao chép đường dẫn tệp từ Windows và dán trực tiếp vào R.

Howeve r, nếu những gì bạn thực sự là một cách sao chép và dán từ Windows Clipboard và nhận được một chuỗi R hợp lệ, hãy thử readClipboard

Ví dụ: nếu tôi sao chép đường dẫn tệp từ Windows Explorer, hãy chạy đoạn mã sau , tôi nhận được một đường dẫn tập tin hợp lệ:

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

'readClipboard()' thực sự làm cho công việc thủ công dễ dàng! Cảm ơn bạn. – Nick

+0

phải có khả năng đảo ngược Enginer readClipboard và tạo ra một chức năng mà những gì op yêu cầu? – Andreas

3

Không, điều này là không thể. Lấy làm tiếc.

+2

Mặc dù tôi lo sợ vào dịp này bạn đúng, tôi đã học được từ kinh nghiệm cay đắng để không bao giờ nói rằng bất cứ điều gì là không thể trong R. – Andrie

+0

Trong trường hợp này, khả năng duy nhất dường như liên quan đến một sự thay đổi khá lớn đối với một số mã nguồn R. Bạn có thể thực hiện một cái gì đó giống như điều chuỗi thô của Python, nhưng bạn phải tinh chỉnh ngữ pháp. Bạn có thể sẽ phá vỡ công cụ .... – Spacedman

+0

Một khả năng khác sẽ là một số loại bộ lọc nguồn. Nhưng nó sẽ không thực sự là R, tôi nghĩ vậy. –

6

1) Nếu E:\DATA\example.csv là vào clipboard sau đó làm điều này:

example.csv <- scan("clipboard", what = "") 
## Read 1 item 
example.csv 
## [1] "E:\\DATA\\example.csv" 

Bây giờ bạn có thể sao chép "E:\\DATA\\example.csv" từ đầu ra trên trên để thả vào clipboard và sau đó dán rằng tôi vào mã nguồn của bạn nếu bạn cần mã cứng đường dẫn.

Nhận xét tương tự áp dụng nếu E:\DATA\example.csv nằm trong tệp.

2) Nếu tập tin tồn tại sau đó một điều để thử là:

example.csv <- file.choose() 

và sau đó điều hướng đến nó và tiếp tục như trong 1) ở trên (ngoại trừ dòng file.choose thay thế báo cáo kết quả scan có).Lưu ý rằng nó không đúng sự thật là bạn cần thay đổi các dấu gạch chéo ngược để chuyển tiếp các dấu gạch chéo cho read.csv trên Windows nhưng nếu vì lý do nào đó bạn thực sự cần thực hiện bản dịch đó thì tập tin này sẽ dịch các dấu gạch chéo ngược về phía trước. (nhưng nếu nó không tồn tại thì nó sẽ đưa ra một cảnh báo gây phiền nhiễu vì vậy bạn có thể muốn sử dụng một trong những cách tiếp cận khác dưới đây):

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

và những dịch backslashes để chuyển tiếp chém ngay cả khi tập tin không tồn tại:

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

hoặc

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

EDIT: Đã thêm thông tin trên normalizePath.

+0

+1 Vì đây là những gì tôi đã nói trong câu trả lời của mình. Lưu ý rằng 'normalizePath' hoạt động ngay cả khi tệp không tồn tại, trong trường hợp đó một cảnh báo được đưa ra. – Andrie

+0

@Andrie, Vâng, điểm tốt là nó thực sự chỉ là một cảnh báo. –

3

Một cách tiếp cận hơi khác tôi sử dụng với một chức năng tùy chỉnh thực hiện mà phải mất một con đường cửa sổ và sửa chữa nó cho R.

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

Hãy thử nó ra!

Khi được nhắc dán đường dẫn vào giao diện điều khiển hoặc sử dụng ctrl + r trên tất cả mọi thứ cùng một lúc

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

Bây giờ bạn có thể ăn nó vào một chức năng

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

Nhưng như những người khác chỉ ra những gì bạn muốn không thực sự có thể.

+0

Cảm ơn @Tyler, có lẽ tôi nên làm rõ rằng tôi cũng quan tâm đến cách giải quyết nên điều này rất hữu ích; Tôi nghi ngờ rằng nó không thể làm theo mặc định. – djq

+0

@celenius Tôi hy vọng những gì bạn muốn là có thể bởi vì tôi đã muốn nó một thời gian. :) Nhưng đây là gần nhất tôi có thể nhận được. :( –

1

Dưới đây là một một dòng vô cùng xấu xí hack để làm điều này trong cơ sở R, không có gói cần thiết:

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

Có thể sử dụng chức năng wrapper nhỏ của riêng mình như vậy (sử dụng suppressWarnings cho yên tâm):

> getwd() 
[1] "C:/Users/username1/Documents" 
> change_wd=function(){ 
+ suppressWarnings(setwd(gsub(", ", "", toString(paste0(read.table("clipboard", sep="\\", stringsAsFactors=F)[1,], sep="/"))))) 
+ getwd() 
+ } 

Bây giờ bạn có thể chạy nó:

#Copy your new folder path to clipboard 
> change_wd() 
[1] "C:/Users/username1/Documents/New Folder" 
Các vấn đề liên quan