引号字符串文字 r“()” 无法与 setwd() 一起正常工作

Quotes string literal r"()" doesn't work properly with setwd()

提问人:Trevor 提问时间:8/20/2022 最后编辑:Konrad RudolphTrevor 更新时间:8/20/2022 访问量:132

问:

我正在尝试在网络驱动器上的 R 中设置一个工作目录。因此,驱动器未初始化。该途径与此类似(尽管我不能直接发布示例)

\\NETWORK_DRIVE\DataFolder\YourFolder 

使用 Quote 命令,我将文件夹路径放入函数中,如下所示。r"()"

r"(\\NETWORK_DRIVE\DataFolder\YourFolder)" 

并获取以下输出。

enter image description here

伟大!这正是我想要的。因此,我决定将两个功能组合在一起:

setwd(r"(\\NETWORK_DRIVE\DataFolder\YourFolder)")

但随之而来的是奇特的行为。

实际工作目录正确变为

//NETWORK_DRIVE/DataFolder/YourFolder

问题是当您从此处使用命令时。然后,您将获得以下内容:getwd()

\\\\NETWORK_DRIVE/DataFolder/YourFolder

这是无害的。除非您再次将此字符串复制/粘贴到命令中,并重置工作目录,否则请再次使用。然后你会得到一个更长的字符串,就像这样。r"()"getwd()

enter image description here

我不完全相信这是字符串文字的预期行为。如果您无意中编写了此类命令,这可能会很快创建无限循环。有谁知道为什么该命令可以很好地粘贴到字符串中,给出正确的路径,但是在使用它时,首先使用正斜杠粘贴网络驱动器,然后在其余部分使用单个反斜杠?我希望行为在逻辑上是:r"()"getwd()

看到字面上的正斜杠,替换为双正斜杠(以避免转义字符)?我理解错了吗?

r 引号文字

评论

1赞 273K 8/20/2022
请展示一个最小的可重复示例。你从哪里来?从终端转储?然后,转义是预期的,并且不会在内存中显示实际字符。\\\\NETWORK_DRIVE\\DataFolder\\YourFolder
0赞 Trevor 8/20/2022
好吧,>\\\\NETWORK_DRIVE\\DataFolder\\YourFolder 显示在我得到它的图片中,它来自 R Studio 中的 r“()” 控制台输出。
0赞 Trevor 8/20/2022
?引用 在 R 控制台中,它是 R 版本 >=4.0 的基础包
0赞 Trevor 8/20/2022
“原始字符常量也可以使用类似于 C++ 中使用的语法:r”(...)“ 和 ...任何字符序列,但不得包含结束序列 ')“'。也可以使用分隔符对 [] 和 {},并且可以使用 R 代替 r。为了增加灵活性,可以在开始引号和开始分隔符之间放置一些破折号,只要在结束分隔符和结束引号之间出现相同数量的破折号。 这个想法是,如果这种行为发生在 R 中,它也可能发生在 C++ 中
0赞 Konrad Rudolph 8/20/2022
一条评论不适合我的回答:你混淆了正斜杠和反斜杠!这是一个正斜杠:(它向书写方向前倾)。这是一个反斜杠:(它向后倾斜)。/\

答:

1赞 Konrad Rudolph 8/20/2022 #1

你所看到的行为是完全正确的,无论如何都与原始字符串文字无关——任何其他字符串也会发生完全相同的情况。

为了说服自己,您可以执行两个实验:

  1. 使用常规字符串文字来设置工作目录,注意转义所有反斜杠:

    setwd("\\\\NETWORK_DRIVE\\DataFolder\\YourFolder")
    
  2. 将网络路径保存到文本文件(使用您选择的文本编辑器)并使用它来设置工作目录:

    setwd(readLines("networkpath.txt"))
    

    ...显然,在文件内部,您不会转义反斜杠。networkpath.txt

在所有三种情况下(原始字符串文本、常规字符串文本、从文件中读取的字符串)调用成功,随后的调用显示以下输出:setwdmessage(getwd())

\\NETWORK_DRIVE/DataFolder/YourFolder

...所以 R 将路径分隔符转换为正斜杠(这有点烦人,但完全有效!),但除此之外会保留路径。

当然,当您直接在终端上调用并显示结果时,R(无论好坏)会向您显示已解剖的 R 字符串文本的向量表示形式,而不是字符串的内容,因此您得到的不是上面的内容getwd()

[1] "\\\\NETWORK_DRIVE/DataFolder/YourFolder"

但这与原始字符串文本无关,也与原始字符串文本无关 - 它只是 R 对交互式控制台上显示的每个值所做的。setwd


说到这里,关于您的具体问题:

这是无害的。除非您再次将此字符串复制/粘贴到命令中,r"()"

好吧,首先,不是“命令”,就像不是命令,或者不是命令一样。什么都不会被执行。这是一种语法。它只是一种在代码中编写字符串文字的方法。r"(…)""…"# …

其次,为什么要将常规字符串文本复制并粘贴到代码中并将其转换为原始字符串文本?它已经正确逃脱了。通过添加它,您正在添加更多级别的转义(因为这是原始字符串文字所做的)。当然,这会改变字符串的值。— 而且,需要明确的是,这再次与 or 无关。如果打印原始字符串文本本身的值,然后复制并粘贴它,则会获得完全相同的行为。r"()"setwdgetwd