在R语言中,如何在字符串或路径中转义反斜杠(\)?

11

Windows复制路径时使用反斜杠\,而R不接受该符号。因此,我想编写一个函数,可以将 \ 转换为 / 。例如:

chartr0 <- function(foo) chartr('\','\\/',foo)

然后使用 chartr0 作为...

source(chartr0('E:\RStuff\test.r'))

但是chartr0没有起作用。我猜想,我无法转义/。我猜想在许多其他情况下转义/可能很重要。

此外,在R中创建一个调用chartr0或使用一些临时方法的环境,是否可以自动转换所有路径而避免每次使用chartr0? 可行吗?例如使用options


2
或者只需使用正斜杠... - Dirk Eddelbuettel
正如Dirk所说,原因是斜杠不需要“转义”。 - IRTFM
你可以使用file.path("E:","Rstuf","test.r")。 - Wojciech Sobala
1
这里有一个有趣的解决Windows斜杠问题的方案:https://dev59.com/kHM_5IYBdhLWcg3w3nXz#12703931 - MattBagg
4个回答

28
R 4.0.0开始,你可以使用r"(...)"来表示路径为raw string constant,这样就不需要进行转义处理了。
r"(E:\RStuff\test.r)"
# [1] "E:\\RStuff\\test.r"

有一种新的语法用于指定原始字符常量,类似于C++中使用的语法:r"(...)",其中...是不包含序列)"的任何字符序列。这使得编写包含反斜杠或单引号和双引号的字符串更加容易。有关更多详细信息,请参见?Quotes

7

你的根本问题在于,当R看到一个反斜杠在除了一些小写字母、反斜杠本身、引号或一些进入八进制、十六进制或Unicode序列的约定之外的任何字符之前时,它会立即发出错误信号。这是因为解释器将反斜杠视为一条消息,要“转义”字符的常规翻译并执行其他操作。如果你想在字符元素中使用一个反斜杠,你需要输入2个反斜杠。这样就会创建一个反斜杠:

nchar("\\")
#[1] 1

"Intro_to_R"的"Character vectors"部分说:

“字符串使用匹配的双引号(")或单引号(')输入,但在打印时使用双引号(有时不用引号)。它们使用C样式转义序列,使用\作为转义字符,因此 \ 输入和打印为 \,双引号 " 在双引号中输入为 \"。其他有用的转义序列包括 \ n,换行符,\ t,制表符和 \ b,退格符 - 请参见?Quotes获取完整列表。”

 ?Quotes

3
chartr0 <- function(foo) chartr('\\','/',foo)
chartr0('E:\\RStuff\\test.r')

您无法写入E:\Rxxxx,因为R认为R已经被转义。


1
这个也可以正常工作:chartr0 <- function(foo) chartr('\\','/',foo) - Josh O'Brien

0
问题在于您代码中的每个正斜杠和反斜杠都被错误地转义,导致使用无效字符串或错误的字符串。您需要了解哪些字符需要转义以及如何转义。请查看下面链接中的转义序列列表。任何未列出的内容(例如正斜杠)都会被视为字面量,不需要进行任何转义。

http://cran.r-project.org/doc/manuals/R-lang.html#Literal-constants


确实反斜杠没有输入正确,但我不理解正斜杠被错误转义的说法。 - IRTFM
1
chartr('\','\\/',foo) 中,似乎 '\\/' 是试图用转义的反斜杠来转义正斜杠。也许这是一个错误的假设,但无论如何,'\\/' 显然是 chartr 的错误输入。 - Ryan C. Thompson
造成错误的不是 '\/',而是 '\',' 序列。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接