提问人:Trevor 提问时间:8/20/2022 最后编辑:Konrad RudolphTrevor 更新时间:8/20/2022 访问量:132
引号字符串文字 r“()” 无法与 setwd() 一起正常工作
Quotes string literal r"()" doesn't work properly with setwd()
问:
我正在尝试在网络驱动器上的 R 中设置一个工作目录。因此,驱动器未初始化。该途径与此类似(尽管我不能直接发布示例)
\\NETWORK_DRIVE\DataFolder\YourFolder
使用 Quote 命令,我将文件夹路径放入函数中,如下所示。r"()"
r"(\\NETWORK_DRIVE\DataFolder\YourFolder)"
并获取以下输出。
伟大!这正是我想要的。因此,我决定将两个功能组合在一起:
setwd(r"(\\NETWORK_DRIVE\DataFolder\YourFolder)")
但随之而来的是奇特的行为。
实际工作目录正确变为
//NETWORK_DRIVE/DataFolder/YourFolder
问题是当您从此处使用命令时。然后,您将获得以下内容:getwd()
\\\\NETWORK_DRIVE/DataFolder/YourFolder
这是无害的。除非您再次将此字符串复制/粘贴到命令中,并重置工作目录,否则请再次使用。然后你会得到一个更长的字符串,就像这样。r"()"
getwd()
我不完全相信这是字符串文字的预期行为。如果您无意中编写了此类命令,这可能会很快创建无限循环。有谁知道为什么该命令可以很好地粘贴到字符串中,给出正确的路径,但是在使用它时,首先使用正斜杠粘贴网络驱动器,然后在其余部分使用单个反斜杠?我希望行为在逻辑上是:r"()"
getwd()
看到字面上的正斜杠,替换为双正斜杠(以避免转义字符)?我理解错了吗?
答:
你所看到的行为是完全正确的,无论如何都与原始字符串文字无关——任何其他字符串也会发生完全相同的情况。
为了说服自己,您可以执行两个实验:
使用常规字符串文字来设置工作目录,注意转义所有反斜杠:
setwd("\\\\NETWORK_DRIVE\\DataFolder\\YourFolder")
将网络路径保存到文本文件(使用您选择的文本编辑器)并使用它来设置工作目录:
setwd(readLines("networkpath.txt"))
...显然,在文件内部,您不会转义反斜杠。
networkpath.txt
在所有三种情况下(原始字符串文本、常规字符串文本、从文件中读取的字符串)调用成功,随后的调用显示以下输出:setwd
message(getwd())
\\NETWORK_DRIVE/DataFolder/YourFolder
...所以 R 将路径分隔符转换为正斜杠(这有点烦人,但完全有效!),但除此之外会保留路径。
当然,当您直接在终端上调用并显示结果时,R(无论好坏)会向您显示已解剖的 R 字符串文本的向量表示形式,而不是字符串的内容,因此您得到的不是上面的内容getwd()
[1] "\\\\NETWORK_DRIVE/DataFolder/YourFolder"
但这与原始字符串文本无关,也与原始字符串文本无关 - 它只是 R 对交互式控制台上显示的每个值所做的。setwd
说到这里,关于您的具体问题:
这是无害的。除非您再次将此字符串复制/粘贴到命令中,
r"()"
好吧,首先,不是“命令”,就像不是命令,或者不是命令一样。什么都不会被执行。这是一种语法。它只是一种在代码中编写字符串文字的方法。r"(…)"
"…"
# …
其次,为什么要将常规字符串文本复制并粘贴到代码中并将其转换为原始字符串文本?它已经正确逃脱了。通过添加它,您正在添加更多级别的转义(因为这是原始字符串文字所做的)。当然,这会改变字符串的值。— 而且,需要明确的是,这再次与 or 无关。如果打印原始字符串文本本身的值,然后复制并粘贴它,则会获得完全相同的行为。r"()"
setwd
getwd
评论
\\\\NETWORK_DRIVE\\DataFolder\\YourFolder
/
\