R使用gsub转义字符串中的括号会导致双反斜杠

时间:2018-01-26 22:39:39

标签: r

我从变量名称向量生成文件名时遇到了这个问题。我有一个包含“(”和“)”的字符串变量,我想正确地转义这些字符,以用作编写器函数的文件名参数(在本例中特别是ggsave)。我一直在尝试使用gsub,这让我非常接近。

problem_string = "Weird_(filename).txt"

gsub("([\\(\\)])", "\\\\\\1", problem_string)
# [1] "Weird_\\(filename\\).txt"
gsub("([\\(\\)])", "\\\\\1", problem_string)
# [1] "Weird_\\\001filename\\\001.txt"

我似乎只能得到双反斜杠。起初我认为这是与后视操作员的一些交互,但如果我尝试替换一个括号,它仍然存在。

gsub("\\(", "\\\\\\(", problem_string)
# [1] "Weird_\\(filename).txt"
gsub("\\(", "\\\\(", problem_string)
# [1] "Weird_\\(filename).txt"
gsub("\\(", "\\(", problem_string)
# [1] "Weird_(filename).txt"

基本上,似乎没有办法获得单个反斜杠。这是两个或没有。这似乎是一种奇怪的行为。

UPDATE(2018年1月29日)

首先,在从评论中获取建议后,我发现我的原始问题实际上是在带有ggsave函数的filename参数中包含“%”,具体而言。我错误地将文件名中的括号识别为罪魁祸首,并在此帖子中删除了我的简化示例中的“%”。但是,我确实发现了一些有趣的行为,在R中使用反斜杠和用作文件名参数的字符串中的特殊字符,所以我在下面包含了额外的探索。

所以R将逃脱的反斜杠视为一个角色下的单个角色:

strsplit(gsub("([\\(\\)])", "\\\\\\1", problem_string), "")
# [[1]]
#  [1] "M"  "e"  "a"  "n"  "_"  "H"  "R"  "_"  "\\" "("  "b"  "e"  "a"  "t"  "s"  "-"  "m"  "i"  "n"  "\\" ")"  "."  "."  "."  "T"  "i"  "m"  "e"  "_"  "D" 
# [31] "o"  "m"  "a"  "i"  "n"  "_"  "R"  "e"  "s"  "u"  "l"  "t"  "s"  "."  "."  "."  "S"  "t"  "a"  "t"  "i"  "s"  "t"  "i"  "c"  "a"  "l"  "_"  "p"  "a" 
# [61] "r"  "a"  "m"  "e"  "t"  "e"  "r"  "s" 

当我使用cat时,双反斜杠被评估为单个反斜杠:

cat(gsub("([\\(\\)])", "\\\\\\1", problem_string))
# Weird_\(filename\).txt

但是,当我在文件写入命令中使用gsub的字符串输出作为filename参数时,不会发生这样的评估:

write.table(c("test"), gsub("([\\(\\)])", "\\\\\\1", problem_string))

list.files(pattern = "Weird")
# [1] "Weird_\\(filename\\).txt"

当我去终端并在保存此文件的目录上运行“ls”时,我可以确认文件名包含反斜杠:它保存为 Weird _ \(filename \)。txt 。事实证明,要保存带括号的文件名,我不需要使用转义字符。

write.table(c("test"), "Weird_(filename).txt")

list.files(pattern = "Weird")
# [1] "Weird_(filename).txt"     "Weird_\\(filename\\).txt"

因此,R的写入函数非常智能,可以在文件名参数中处理这些特殊字符,而无需用户明确地转义它们。当我试图用反斜杠转义括号时,R也包括文件名中的那些。

0 个答案:

没有答案