【发布时间】:2021-10-23 18:31:08
【问题描述】:
唯一与我的问题最接近的是:are-there-raw-strings-in-r 然而,这对我的帮助还不够。
问题
我在数据框中有类似 Windows 的格式化路径:
data.frame(path = c("X:\01_aim\01_seq.R", "X:\01_aim\02_seq.R", "X:\01_aim\03_seq.R"),
dat = c("data1.csv", "data2.csv", "data1.csv"))
目的是将路径转换为类 Unix 路径,因此我需要如下输出:
data.frame(path = c("/01_aim/01_seq.R", "/01_aim/02_seq.R", "/01_aim/03_seq.R"),
dat = c("data1.csv", "data2.csv", "data1.csv"))
我的方法
您在上面看到的一种操作路径的方法会产生以下错误:
> sub("\0", "##", "X:\01_aim\01_seq.R")
# Error: nul character not allowed (line 1)
我已经找到了使用r"()" 格式化选项打印路径的方法,它给出了:
> r"(X:\01_aim\01_seq.R)"
[1] "X:\01_aim\01_seq.R"
这样我的最终解决方案将接近:
tmp_path <- str_replace_all(string = r"(X:\01_aim\01_seq.R)",
pattern = r"(\\)",
replacement = "/")
str_replace_all(tmp_path, r"(X:)", "")
[1] "/01_aim/01_seq.R"
但我缺乏的是如何在变量中的给定字符串上强制字符串的r"( )" 格式。具体来说,当我有一个功能时:
convert.path <- function(my.path){
# how can I force the variable my.path to be stored as r"(`my.path`)"
# so that I can insert the above code here.
my.path.raw <- to.r.brackets(my.path)
tmp_path <- str_replace_all(my.path.raw, pattern = r"(\\)", replacement = "/")
str_replace_all(tmp_path, r"(X:)", "")
}
我想强制重新格式化以代替 cmets。有谁知道如何制作这个技巧?
【问题讨论】:
-
您的
my.path应该已经包含正确的字符串(= text)。否则,没有其他办法。除非有一些你没有解释的场景。 -
也许您可以拆分路径并使用 R 的
file.path函数? -
你的前提是错误的。
r"( )"字符串的存储方式与其他字符串的存储方式没有区别。r"( )"格式只是在代码中指定字符串的一种方式。它使用与通常的" "字符串不同的输入规则,但它生成和存储的内容与其他字符串没有区别。 -
@user2554330 好的,所以基本上没有办法让这段代码工作:
my.path <- "X:\01_aim\01_seq.R", sub("\0", "##", my.path)? -
那不是法律代码。在常规字符串代码中,
"\0"表示空字符,而不是后跟零的反斜杠,并且 R 字符串中不允许使用空值。要编码您的路径,您应该使用"X:\\01_aim\\01_seq.R"。在sub()中,情况更糟,因为您需要一个双反斜杠来匹配一个反斜杠,并且您需要"\\\\"来编码两个反斜杠。所以sub()应该是sub("\\\\0", "##", my.path)。
标签: r regex string path formatting