r - R中find_replace nul字符

标签 r regex string path formatting

唯一最接近我的问题的是: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:)", "")
}

我想强制重新格式化以代替注释。有谁知道如何制作这个技巧吗?

最佳答案

一种方法是使用gsub() eval(parse(text = ...))内:

dat <- data.frame(path = c("X:\01_aim\01_seq.R", "X:\01_aim\02_seq.R", "X:\01_aim\03_seq.R", "X:\01_aim\04_seq.R"), 
                  dat = c("data1.csv", "data2.csv", "data1.csv", "data2.csv"))

temp <- eval(parse(text= gsub("\\", "/", deparse(dat$path), fixed=TRUE)))
gsub("X:", "", temp)

#> [1] "/001_aim/001_seq.R" "/001_aim/002_seq.R" "/001_aim/003_seq.R"
#> [4] "/001_aim/004_seq.R"

reprex package 于 2021 年 8 月 23 日创建(v2.0.1)

另一种方法是使用 stringi::stri_escape_unicode 转义包含一个反斜杠的字符串。 。由于字符串在转义之前已转换为 unicode,因此会添加不需要的 u0在每对反斜杠之后。然后我们可以使用gsub("\\\\u0", "/")获取所需的文件路径。

dat <- 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"))


temp <- gsub("X:", "", stringi::stri_escape_unicode(dat$path))
gsub("\\\\u0", "/", temp)
#> [1] "/001_aim/001_seq.R" "/001_aim/002_seq.R" "/001_aim/003_seq.R"

reprex package 于 2021 年 8 月 23 日创建(v2.0.1)

关于r - R中find_replace nul字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68892051/

相关文章:

r - 在R的data.table环境中创建公式

R 不召回内存中的对象

r - 将极坐标图作为单独的对象添加到 ggplot/ggmap 中?

php - 预匹配 : and-not expression

php - 根据字符串中的位置替换

regex - 使用解析器组合器整理文本行

c - C 中接受字符串和 "filters out"所有非数字字符以及除第一个点之外的所有字符的函数?

c - strcmp() 在 C 中究竟返回什么?

r - 覆盖 dplyr 中的 "Variables not shown",以显示来自 df 的所有列

使用 ServiceStack/ORMLite 进行 C# 字符串修剪