2011-01-13 47 views
17

Khi chạy trình cắm R trong SPSS, tôi nhận được chuỗi đường dẫn Windows làm đầu vào, ví dụ:Bỏ qua các ký tự thoát (dấu gạch chéo ngược) trong chuỗi R

'C:\Users\mhermans\somefile.csv' 

Tôi muốn sử dụng con đường trong mã R tiếp theo, nhưng sau đó các dấu gạch chéo cần phải được thay thế bằng dấu gạch chéo, nếu không R diễn giải nó như thoát (ví dụ. "\ U sử dụng mà không chữ số hex" lỗi) .

Tuy nhiên, tôi chưa thể tìm thấy chức năng có thể thay thế các dấu gạch chéo ngược bằng dấu gạch chéo hoặc bỏ hai lần thoát. Tất cả các hàm đó giả định rằng các ký tự đó được thoát.

Vì vậy, là có cái gì đó dọc theo dòng:

>gsub('\\', '/', 'C:\Users\mhermans') 
C:/Users/mhermans 
+0

Bạn có thể đưa ra ít nhất một chút mã xung quanh vấn đề không? Chuỗi đến từ đâu? Làm thế nào nó nhập mã R? Nếu bạn nhận được lỗi, đó là quá muộn, và lỗi đó xảy ra như xa như tôi đang quan tâm chính xác tại điểm nơi chuỗi đi vào R. –

Trả lời

12

Bạn có thể cố gắng sử dụng lập luận của allowEscapes 'trong quét()

X=scan(what="character",allowEscapes=F) 
C:\Users\mhermans\somefile.csv 

print(X) 
[1] "C:\\Users\\mhermans\\somefile.csv" 
+2

allowEscapes = FALSE là mặc định để người ta có thể viết tắt rằng để 'x <- scan (what = "") ' –

+2

Quét() có vẻ là một lệnh tương tác. Có thể sử dụng trong một kịch bản, được kích hoạt bởi một hộp thoại (do đó chạy trong nền) không? – mhermans

+0

Nếu bạn đặt lệnh quét theo sau là đầu vào theo sau là dòng trống trong tập lệnh 'abc.R' và sau đó chạy 'Rscript abc.R' tại dòng lệnh của hệ điều hành, nó sẽ hoạt động nhưng nó sẽ không hoạt động nếu bạn sử dụng 'source (" abc.R ")' từ bên trong R. –

5

Trước tiên, bạn cần phải làm cho nó được gán cho một tên:

pathname <- 'C:\\Users\\mhermans\\somefile.csv' 

Lưu ý rằng để đưa nó vào vectơ tên bạn cần để tăng gấp đôi tất cả, cung cấp gợi ý về cách bạn có thể sử dụng regex:

gsub("\\\\", "/", pathname) 
# [1] "C:/Users/mhermans/somefile.csv" 

Bạn cần tăng gấp đôi các dấu gạch chéo ngược. Đầu tiên của mỗi cặp là để báo hiệu cho máy grep rằng kết quả là một chữ.

+1

Nhưng R diễn giải "C: \\ Users \\ mhermans \\ somefile.csv" theo cùng cách với "C: /Users/mhermans/somefile.csv" phải không?Vấn đề nằm ở việc đọc một chuỗi với một dấu gạch chéo ngược và biến nó thành một trong hai giải pháp đó. –

+0

Không. Bạn không hiểu. Chỉ có một dấu gạch chéo ngược trong chuỗi mà tôi tạo ra. Bạn cần phải hiểu sự khác biệt giữa biểu diễn và thực tế. "\\" không phải là "/" . Hãy thử 'nchar (" \\ ")' để có thêm tiến bộ về phía ánh sáng. –

+1

Tôi thực sự có một chuỗi với dấu nháy đơn là đầu vào, không phải dấu ngoặc kép. Trong trường hợp này, thực tế theo R là "C: Người dùng hermans", được biểu thị bằng "C: \ Users \ mhermans". Tôi cần R để nhận ra "C: \ Users \ mhermans" là thực tế. – mhermans

1

Nếu tập tin E: \ Data \ junk.txt chứa các văn bản sau đây (không có dấu ngoặc kép): C: \ Users \ mhermans \ somefile.csv

Bạn có thể nhận được một cảnh báo với các tuyên bố sau, nhưng nó sẽ công việc:

texinp <- readLines("E:\\Data\\junk.txt") 

Nếu tập tin E: \ Data \ junk.txt chứa các văn bản sau đây (với dấu ngoặc kép): "C: \ Users \ mhermans \ somefile.csv"

các readlines tuyên bố trên cũng có thể cảnh báo cho bạn, nhưng bây giờ sẽ chứa:

"\" C: \ Users \ mhermans \ somefile.csv \ ""

Vì vậy, để có được những gì bạn muốn, chắc chắn rằng không có dấu ngoặc kép trong tập tin gửi đến, và sử dụng:

texinp <- suppressWarnings(readLines("E:\\Data\\junk.txt")) 
+0

Điều đó có vẻ là một khả năng, nếu tôi viết chuỗi mà tôi nhận được làm đầu vào từ hộp thoại đến tạm thời và đọc lại. Có cách nào để thực hiện điều này mà không có bước ghi/đọc không? – mhermans

+0

@mhermans: 'readLines' có thể lấy đầu vào từ bất kỳ kết nối nào, không chỉ từ các tệp. Bạn lấy chuỗi từ đâu? –

+0

@mhermans: Như Richie đã nói ở trên, nó có thể có nhiều kết nối khác nhau. Từ bình luận của bạn về một "hộp thoại", bạn có thể thử sao chép chuỗi vào clipboard. Sau đó sử dụng texinp <- suppressWarnings (readLines ("clipboard")) –

Các vấn đề liên quan