在R中替换单个反斜杠

6

我在stackoverflow上阅读了一些关于这个主题的问题和答案,但仍然不知道如何解决这个问题:

我的目的是将Windows资源管理器中的文件目录字符串转换为R中可识别的形式,例如C:\Users\Public需要转换为C:/Users/Public,基本上单个反斜杠应该被替换为正斜杠。然而,R无法存储原始字符串"C:\Users\Public",因为\u和\P被视为转义字符。

dirTransformer <- function(str){
   str.trns <- gsub("\\", "/", str)
   return(str.trns)
   }

str <- "C:\Users\Public"
dirTransformer(str)

> Error: '\U' used without hex digits in character string starting ""C:\U"

我实际上正在编写一个GUI界面,其中用户可以将目录输入或粘贴到输入框中,然后按下按钮,程序将自动进行处理。

请问是否有人能够建议我如何解决这个问题?


"C:\Users\Public" - 使用双反斜杠表示字面上的反斜杠。 - Wiktor Stribiżew
@WiktorStribiżew 那意味着我必须手动修改目录。我的目的是开发一个函数,可以自动处理和转换目录,无需手动干预。 - Vincent
你已经手动输入了 str <- "C:\Users\Public" - 为什么不做得对一些,输入 str <- "C:\\Users\\Public" 呢? 另外,不是 gsub("\\", "/", str) 这样写,而是 gsub("\\", "/", str, fixed=TRUE) - Wiktor Stribiżew
1
@WiktorStribiżew 那只是一个简化的例子。我实际上正在编写一个GUI,用户在输入框中键入或粘贴目录,然后点击按钮,程序将对其进行处理。fixed = TRUE 是一种修正。谢谢。 - Vincent
你可以尝试使用 tools::normalizePath("C:\\Users\\Public","/",TRUE") - Silence Dogood
2个回答

5
当您需要在R字符串中使用反斜杠时,需要输入双反斜杠。此外,当您使用gsub("\\", "/", str)时,第一个参数被解析为正则表达式,但它不是有效的,因为它仅包含一个反斜线文本必须转义。实际上,您需要使用fixed=TRUE将其作为纯文本处理。
但是,您可能希望使用normalizePath,请参见这个SO线程

normalizePath(readClipboard()) 似乎是最佳解决方案。感谢您的回答! - Vincent

1
dirTransformer <- function(str){
  str.trns <- gsub("\\\\", "/", str)
  return(str.trns)
}

str <- readline()
C:\Users\Public

dirTransformer(str)

我不确定您打算如何让用户在GUI中输入路径,但是当使用readline()然后键入未引用的C:\Users\Public时,R会将其读取为:

> str
[1] "C:\\Users\\Public"

我们希望将“\\”替换为“/”,但为了转义“\\”,在gsub中需要使用“\\\\”。我无法确定用户输入在GUI中如何被读入R,但R很可能会像使用readline示例时一样转义字符串中的\s。你试图创建的字符串"C:\Users\Public"通常不会发生。

如果OP需要替换一个字面上的反斜杠,为什么要在gsub中使用正则表达式呢?使其与gsub一起工作的唯一必要条件是使用fixed=TRUE禁用将第一个参数解析为正则表达式。 - Wiktor Stribiżew
我主要是写这个答案来说明他测试的"C:\Users\Public"字符串实际上并不存在。此外,相比于添加2个反斜杠,添加额外的参数有什么优势呢?使用fixed = TRUE更快吗?可以说这样做可能会更加简洁/清晰,但我不认为这是一个非常重要的问题。 - Marijn Stevering
使用字符串替换时,不会创建正则表达式对象,这是一些额外开销 - 或者至少大多数人认为这是一种开销。在大多数情况下并不是什么大问题。 - Wiktor Stribiżew
使用readline()的这种方法也很有帮助!谢谢你。我会尝试将其集成到我正在编写的GUI中。 - Vincent

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