【问题标题】:Raw text strings for file paths in RR中文件路径的原始文本字符串
【发布时间】:2011-11-19 20:25:39
【问题描述】:

在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 操作系统上的一个问题)。

【问题讨论】:

  • 一定要跳到最近的答案——R 4.0 之前的所有答案都需要不再需要的变通方法:stackoverflow.com/a/61672183/3576984
  • +1,@djq,因为您仍然活跃,请考虑接受 Caleb Fitzgerald 的回答。它现在被埋没了,并且已经提示了重复的答案。
  • 完成 - 感谢您告诉我。

标签: r string


【解决方案1】:

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

但是,如果您真正追求的是一种从 Windows 剪贴板复制和粘贴并获得有效 R 字符串的方法,请尝试 readClipboard

例如,如果我从 Windows 资源管理器复制文件路径,然后运行以下代码,我会得到一个有效的文件路径:

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

【讨论】:

  • 必须可以对 readClipboard 进行逆向工程并创建一个执行 op 要求的函数?
【解决方案2】:

现在可以使用 R 版本 4.0.0。请参阅?Quotes 了解更多信息。

例子

r"(c:\Program files\R)"
## "c:\\Program files\\R"

【讨论】:

    【解决方案3】:
    1. 如果E:\DATA\example.csv 在剪贴板上,则执行以下操作:

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

    现在您可以将上述输出中的"E:\\DATA\\example.csv" 复制到剪贴板,然后如果您需要对路径进行硬编码,请将其粘贴到您的源代码中。

    如果E:\DATA\example.csv 在文件中,则应用类似的说明。

    1. 如果文件存在,那么要尝试的另一件事是:

      example.csv

    然后导航到它并按照上面的 1) 继续(除了file.choose 行替换了那里的scan 语句)。

    1. 请注意,您需要在 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"
    
    1. 在 4.0+ 中支持以下语法。 ?Quotes 讨论了其他变体。

       r"{E:\DATA\example.csv}"
      

    编辑:添加了有关normalizePath 的更多信息。 编辑:添加 (4)。

    【讨论】:

    • +1 因为这几乎就是我在回答中所说的。请注意,即使文件不存在,normalizePath 也可以工作,在这种情况下会发出警告。
    【解决方案4】:

    我使用的一种稍微不同的方法是使用自定义函数,该函数采用 Windows 路径并针对 R 进行更正。

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

    让我们试试吧!

    当出现提示时,将路径粘贴到控制台或在所有内容上使用 ctrl + r

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

    现在您可以将其提供给函数

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

    但正如其他人指出的那样,您想要的并不是真正可能的。

    【讨论】:

    • 谢谢@Tyler,也许我应该澄清一下我也对解决方法感兴趣,所以这非常有用;我怀疑默认情况下是不可能做到的。
    • @celenius 我希望你想要的东西是可能的,因为我想要它已经有一段时间了。 :) 但这是我能得到的最接近的。 :(
    【解决方案5】:

    不,这对于 4.0.0 之前的 R 版本是不可能的。对不起。

    【讨论】:

    • 虽然我担心这次你是对的,但我从痛苦的经历中学到了永远不要说在 R 中任何事情都是不可能的。
    • 在这种情况下,唯一的可能性似乎涉及对某些 R 源代码进行相当大的更改。你可以实现类似于 Python 的原始字符串的东西,但你必须调整语法。你可能会弄坏东西......
    • 另一种可能性是某种源过滤器。但我认为,它不会真的是 R。
    • 我认为是——它需要在 sep 参数中作弊 read.table,但这绝对是可能的。
    【解决方案6】:

    我知道这个问题很老,但是对于最近偶然发现这个问题的人来说,想要与最新版本 R4.0.0 分享,可以解析原始字符串。其语法为r"()"。请注意,字符串放在括号中。

    例子:

    > r"(C:\Users)"
    [1] "C:\\Users"
    

    来源:https://cran.r-project.org/doc/manuals/r-devel/NEWS.html 跳转到部分:用户可见的重大变化。

    【讨论】:

    • 谢谢,但 Caleb Fitzgerald 比你早几个月给出了这个答案
    【解决方案7】:

    这是在基本 R 中执行此操作的一个非常丑陋的单行 hack,无需任何包:

    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"
    

    【讨论】:

      【解决方案8】:

      要回答“我可以在 R 中解析原始字符串而不必双转义反斜杠吗?”的实际问题?这是一个很好的问题,除了剪贴板的特定用例之外还有很多用途。

      我发现了一个似乎提供此功能的包:

      https://github.com/trinker/pathr

      参见“win_fix”。 文档中指定的用例正是您刚才所说的用例,但是我还没有调查它是否可以处理更灵活的使用场景。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-06
        • 2020-06-10
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        • 1970-01-01
        相关资源
        最近更新 更多