2011-11-19 104 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" 
相关问题