我从变量名称向量生成文件名时遇到了这个问题。我有一个包含“(”和“)”的字符串变量,我想正确地转义这些字符,以用作编写器函数的文件名参数(在本例中特别是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也包括文件名中的那些。