2011-11-19 57 views
22

在R中指定文件路徑字符串以忽略轉義字符時,是否可以使用前綴?R中的文件路徑的原始文本字符串

例如,如果我想使用Windows文件時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中是否有類似的命令,或者我可以用來避免出現此問題的方法。 (我在Windows,Mac和Linux之間移動 - 這顯然只是Windows操作系統的一個問題)。

+13

我希望[R確實有原始字符串。 – hadley

+0

謝謝大家 - 關於如何處理這個問題的很多有用的提示。我把@ Andrie's標記爲答案,但我也發現G.Grothendieck的解決方案很有用。 – djq

+0

在R中會有這樣的好處。 C#例如爲字符串提供了@前綴,例如, @「c:\ temp \ file.csv」這會導致將\轉到\\ – Saar

回答

32

您可以使用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" 

但你的問題直接回應:我不知道的一種方式來忽略使用R的轉義序列。換句話說,我不相信有可能從Windows複製文件路徑並將其直接粘貼到R.

Howeve r,如果你實際上是從Windows剪貼板複製和粘貼並獲取有效的R字符串的方式,請嘗試readClipboard

例如,如果我從Windows資源管理器複製文件路徑,則運行以下代碼,我得到一個有效的文件路徑:

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

'readClipboard()'確實使手動工作變得簡單!謝謝。 – Nick

+0

必須可以反向工程readClipboard並創建一個功能,做什麼操作? – Andreas

3

不,這是不可能的。抱歉。

+2

雖然我擔心這次你是對的,但我從苦難的經驗中學到,從來沒有說過任何事情都不可能在R. – Andrie

+0

In這種情況下唯一的可能性似乎涉及R源代碼的一些改變。你可以像Python的原始字符串那樣實現一些東西,但是你必須調整語法。你可能會打破東西.... – Spacedman

+0

另一種可能性是某種源過濾器。但是,我認爲這不會是真的。 –

6

1)如果E:\DATA\example.csv在剪貼板,然後做到這一點:

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

現在,你可以從上面的上面的輸出複製"E:\\DATA\\example.csv"到剪貼板,然後粘貼我nto你的源代碼,如果你需要硬編碼的路徑。

如果E:\DATA\example.csv位於文件中,則類似備註適用。

2)如果該文件存在,那麼另一件事是嘗試:

example.csv <- file.choose() 

,然後導航到它,並繼續作爲1)以上(除file.choose線取代了scan聲明那裏)。3)請注意,您不需要在Windows上將反斜槓更改爲read.csv的正斜槓,但如果由於某種原因您確實需要進行該翻譯,那麼如果該文件存在,則會將反斜槓轉換爲正斜槓(但如果不存在,那麼它會給出一個惱人的警告,所以你可能需要使用下面的其他方法之一):

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

和這些翻譯反斜槓轉發,即使該文件不存在斜線:

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

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

編輯:添加normalizePath更多信息。

+0

+1因爲這幾乎是我在我的回答中所說的。請注意,即使文件不存在,normalizePath也可以工作,在這種情況下會發出警告。 – Andrie

+0

@Andrie,是的,好點,它只是一個警告。 –

3

稍微不同的方法我認爲需要一個Windows路徑並糾正它R.

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

定製的功能使用讓我們嘗試一下!

當提示粘貼一次

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

的路徑進入控制檯或使用Ctrl + R鍵上的一切現在你可以將其提供給一個函數

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

但是你要爲別人指出的是什麼並不是真正可行的。

+0

謝謝@泰勒,也許我應該澄清一點,我也對解決方法感興趣,所以這非常有用;我懷疑這是默認無法做到的。 – djq

+0

@celenius我希望你想要什麼是可能的,因爲我想要它一段時間。 :)但這是我能得到的最接近的。 :( –

1

這裏是一個令人難以置信的醜陋單行黑客在基礎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" 
相關問題