在R中高效地将反斜杠转换为正斜杠

95

我正在寻找一种高效的方法来在 R 中将反斜杠转换为正斜杠。有时我会复制 Windows 中目录的链接,得到如下所示:

C:\Users\jd\Documents\folder\file.txt

我该如何快速更改为 C:/Users/jd/Documents/folder/file.txt?我甚至无法将上述表达式读取为字符。它会抛出错误。

"\u used without hex digits in character string starting ""C:\u".

我知道 R 中的 TAB 函数可以帮助快速查找位置,但只是想知道是否还有其他解决方法。我也可以将工作目录更改为文件夹的位置。我只是在尝试将反斜杠转换为正斜杠时遇到了困难,因此出于好奇心而问这个问题。


10
R 4.0.0 版本开始,您可以使用 r"(...)" 来将路径表示为原始字符串常量。请参见在 R 中转义反斜杠(\)的字符串或路径 - Henrik
我在下面添加了类似的解决方案后才发现了你的评论。我似乎找不到关于这个的文档,r"[...]" 也可以工作。我想知道是否可以传递对象以及字符串? - pluke
这是文档,似乎不允许传递变量:https://stat.ethz.ch/R-manual/R-devel/library/base/html/Quotes.html - pluke
2
真的没有办法以编程方式完成这个吗? - Diego
有人知道是否有一种修改方法,可以使r"(...)"这个正则表达式适用于从Excel VBA宏中作为传递参数的字符串吗? - pseudorandom
11个回答

70

在R语言中,你需要用\\来转义\。所以你的路径应该是:

In R, you've to escape the \ with \\ So, your path should be:

x <- "C:\\Users\\jd\\Documents\\folder\\file.txt"

为了获得这个,您可以执行以下操作:

x <- readline()

然后,在提示符处粘贴您的未修改的路径(CTRL + V 然后 ENTER)。

最后,要将\\替换为/,可以使用gsub,再次转义\,但是要转义两次,如下所示:

gsub("\\\\", "/", x)
# [1] "C:/Users/jd/Documents/folder/file.txt"

1
谢谢你的回答。我想将反斜杠表达式改为正斜杠的唯一原因是,在Windows中,当我尝试复制特定正斜杠的地址时,它只有一个反斜杠。现在,手动添加反斜杠是不高效的。现在,我理解复制根本行不通。 - Jd Baba
25
readClipboard() 是另一个选项,它会自动将复制的文本中的反斜杠从一个转换为两个。 - thelatemail
1
@thelatemail 谢谢,看起来 readClipboard() 就是我要找的。 - Jd Baba
3
在我的电脑上,路径被复制并带有双引号:"C:\Users\...\file.txt"。当我使用readline()读取时,周围的引号被转义,字符串看起来像这样:"\"C:\\Users\\...\\file.txt\"",这需要一个比你在答案中提供的更复杂的正则表达式才能将其转换为可用的路径。如果您使用scan(what =“character”)而不是readline(),就可以避免这个问题。 - user1322720
在RStudio中,您可以从编辑器运行以下命令:x <- readline() C:\Users\jd\Documents\folder\file.txt,其中命令位于单独的一行。 - Alex

53

如果您希望在粘贴路径时使用最少的按键来转换反斜杠,请使用如下所定义的RStudio 代码片段

snippet pp
    "`r gsub('"', "", gsub("\\\\", "/", readClipboard()))`"

记得在第二行前使用制表符,而不是多个空格,以使代码片段正常工作。

然后输入ppTABENTER,你的剪贴板上的文本将被粘贴,反斜杠将被替换为正斜杠并用引号括起来。

以下是我通常使用的步骤,一旦定义了上面的代码片段,就可以将文件路径复制到RStudio中:

  1. 在资源管理器中导航到文件路径。
  2. 如果要复制文件路径,则:在文件上按Shift+右键单击,然后单击复制路径
  3. 如果要复制文件夹路径,则:按Alt+dCtrl+c
  4. 切换到RStudio窗口,在你想要粘贴路径的R脚本中聚焦。
  5. ppTABENTER将路径粘贴到RStudio中,并将反斜杠转换为正斜杠。

3
两年后,我写了一个叫做 pp 的代码片段,并兴奋地回到这个问题想要将它作为答案发布,结果看到了这个表情: :-( ,还有一个 +1。 - Josh
我不理解你的代码片段,特别是反引号\``外面的引号"和第一个gsub()。我使用了"`r gsub("\\", "/", readClipboard())`"`。 - Josh
2
gsub和引号确保从资源管理器地址栏复制的路径(没有引号)和通过“复制为路径”复制的路径(有引号)都带有引号粘贴。 - Josh Gilfillan

19

我使用 Path Copy Copy 这个插件,它可以在 Windows 上右键单击文件/文件夹时创建自定义复制命令。因此,我的右键菜单中有“使用正斜杠复制完整路径”选项,可将文件/文件夹复制成正斜杠格式。我猜每年可以为我节省数天时间,因为不需要手动更改反斜杠为 R 的格式。


1
我认为这是所有答案中最省时的解决方案。 - John Doe

14

我喜欢使用RStudio插件snippetsaddin,其中包含函数'Convert slash'

它会反转所选代码块中的所有斜杠,或者如果没有选择(或仅选择了空格),则会反转剪贴板中的所有斜杠并将其粘贴到当前光标位置。

插件像软件包一样安装。 要安装此插件,请执行以下操作:

devtools::install_github("sfr/RStudio-Addin-Snippets", type = "source")

12
如果我理解正确,你确实想要摆脱字符串编辑。为了能够使用gsub,你首先需要手动将所有的\更改为\\。那么,为什么不一开始就将\更改为/呢?
如果你将字符串复制到剪贴板中,可以使用:
  x=scan("clipboard",what="string")

这会提供

  "C:\\Users\\jd\\Documents\\folder\\file.txt"

也就是说,它会自动地将所有的 \ 转换为 \\

我知道 - 这并不是很方便,但这是我能想到的唯一解决编辑问题的方法。


顺便说一下:“剪贴板”是指您使用“CTRL+V”复制的内容。 - cryo111
1
当我用空格分隔文件夹名称时,得到的结果与预期不符。例如 C:\Users\jd\Documents\my country\my name\file.txt - Jd Baba
嗯...说得好。你可以使用不同的分隔符 x=scan(“clipboard”,what=“string”,sep=“;”)。我已将其更改为;。我认为在文件路径中不允许使用分号,对吧?因此,选择分号作为分隔符是比较保险的。 - cryo111

11

这是一种将剪贴板中的地址转换为网页链接的简便方法。

x  <- gsub  ( "\\\\",  "/",  readClipboard ()  ) 

10

autohotkey程序:

^+v::
StringReplace, clipboard, clipboard, \,/,All
send %clipboard%

按下控制键+c复制文件路径,使用控制键+shift+v进行粘贴。


在 R 中,这应该在哪里做? - Col Bates - collynomial
1
这是一个AutoHotkey程序。它在后台运行。https://www.autohotkey.com/ - hedgedandlevered

5

R 内置了 r"(C:\myfolder\)" 命令,该命令将字符串中的反斜杠转换为双反斜杠。

x <- r"(C:\myfolder\)"
print(x)

"C:\\myfolder\\"

唯一的问题是它不能接受变量,只能接受类型化的字符串。


5
没有代码片段定义的解决方案是:
writeClipboard(gsub("\\\\", "/", readClipboard()))

0

我认为摆脱麻烦的最佳方法是在Rstudio的右侧面板中找到文件。然后点击“更多”并点击“设置为工作目录”。然后你会在控制台中看到“setwd(...)”。你可以将其复制到你的代码中。


2
这不是很高效的方法。这意味着每个文件都需要更改工作目录。 - NelsonGon

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