忽略R语言字符串中的转义字符(反斜杠)。

28

当我在SPSS中运行R插件时,我会收到一个Windows路径字符串作为输入,例如:

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

我希望在后续的R代码中使用该路径,但需要将反斜杠替换为正斜杠,否则R会将其解释为转义字符(例如"\U used without hex digits"错误)。

然而,我找不到可以替换反斜杠为正斜杠或双重转义它们的函数。所有这些函数都假定这些字符已经被转义了。

因此,是否有类似于以下的东西:

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

你能提供更多关于问题的代码吗?这个字符串是从哪里来的?它是如何进入R代码的?如果你得到了错误,那就太晚了,因为在我的看法中,这个错误恰好发生在字符串进入R的时候。 - Joris Meys
4个回答

16

您可以尝试在scan()函数中使用'allowEscapes'参数。

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

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

2
allowEscapes=FALSE 是默认设置,因此可以缩写为 x <- scan(what = "") - G. Grothendieck
3
Scan()似乎是一个交互式的命令。是否可以在对话框触发的脚本中使用,从而在后台运行? - mhermans
如果您在脚本abc.R中输入扫描命令,然后跟随一个空行和输入,然后在操作系统的命令行上运行Rscript abc.R,它将起作用,但如果您从R内部使用source("abc.R"),它将不起作用。 - G. Grothendieck
如果文件名中有空格,则scan功能会认为有多个输入。这是合理的行为,但对我来说很烦人,因为我的一个文件夹中有一个空格。 - Nate Anderson
我使用这个工具将ASCII艺术导入我的应用程序。 - MadmanLee

12
自从2020年4月推出版本4.0以来,R语言提供了一种指定原始字符串的语法。这个例子中的字符串可以写成:
path <- r"(C:\Users\mhermans\somefile.csv)"

来自 ?Quotes:

使用类似于C ++中使用的语法 r"(...)",也可以使用原始字符常量,其中...是除了不能包含关闭序列 )"之外的任何字符序列。也可以使用定界符对 [] 和 {},并且 R 可以用于代替 r。为了增加灵活性,在开头引号和开头定界符之间可以放置多个破折号,只要在结束定界符和结束引号之间出现相同数量的破折号即可。


5

首先您需要给它指定一个名称:

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

注意,为了将其放入名称向量中,您需要将它们全部加倍,这提供了有关如何使用正则表达式的提示。实际上,如果您从文本文件中读取它,那么R将为您完成所有加倍操作。请注意,它并没有真正加倍反斜杠。它被存储为单个反斜杠,但显示为这样,并且需要从控制台以此方式输入。否则,R解释器会尝试(并经常失败)将其转换为特殊字符。而且,为了复合问题,正则表达式也使用反斜杠作为转义符。因此,要使用grep或sub或gsub检测转义符,您需要将反斜杠加倍。
 gsub("\\\\", "/", pathname)
# [1] "C:/Users/mhermans/somefile.csv"

您需要将反斜杠加倍。每对\'s的第一个是向grep机器发出信号,指示接下来的内容是字面上的。

请考虑以下例子:

 nchar("\\A")
#  returns `[1] 2`

2
但是R解释"C:\Users\mhermans\somefile.csv"和"C:/Users/mhermans/somefile.csv"的方式是一样的,对吗?问题在于读取一个包含单个反斜杠的字符串,并将其转换为这两种解决方案之一。 - Sacha Epskamp
不,你没有理解。我创建的字符串中只有单个反斜杠。你需要理解表示和实际之间的区别。 "\" 不是 "/"。尝试使用 nchar("\\") 进一步了解。 - IRTFM
1
我确实有一个带单引号的字符串作为输入,而不是双引号。在这种情况下,根据 R 的实际情况是 "C:<escaped U>Users<escaped m>hermans",表示为 "C:\Users\mhermans"。我需要 R 意识到 "C:\Users\mhermans" 才是真实情况。 - mhermans
请提供该字符串的dput()输出。这确实是以明确方式传达内部结构的方法。 - IRTFM
1
“你需要将它们全部加倍” - 我该怎么做?在我的情况下,我从Windows资源管理器中复制了路径,并将带有单个反斜杠的字符串粘贴到了剪贴板中。我必须手动编辑字符串吗?还是可以使用R技巧?我知道我可以使用UI在RStudio中将文件夹设置为工作目录,但无论如何我都很好奇... - Nate Anderson
不,你不需要先编辑它,但是如果你打印它,尽管内部只有一个反斜杠,但它将显示为两个反斜杠。 - IRTFM

1
如果文件E:\Data\junk.txt包含以下文本(不带引号):C:\Users\mhermans\somefile.csv
您可能会收到以下语句的警告,但它将起作用:
 texinp <- readLines("E:\\Data\\junk.txt")

如果文件E:\Data\junk.txt包含以下文本(带引号):"C:\Users\mhermans\somefile.csv"
上述readlines语句可能会给出警告,但现在将包含:

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

所以,为了得到你想要的结果,请确保输入文件中没有引号,并使用:

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

如果我将从对话框接收到的字符串写入临时文件,然后再读取回来,似乎是一个可能性。有没有一种方法可以避免写入/读取的步骤呢? - mhermans
@mhermans:readLines 可以从任何连接获取输入,不仅限于文件。你的字符串是从哪里获取的? - Richie Cotton
@mhermans:正如Richie在上面所说,它可以使用各种连接。根据您关于“对话框”的评论,您可以尝试将字符串复制到剪贴板中。然后使用texinp <- suppressWarnings(readLines(“clipboard”)) - bill_080

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