find_replace R 中的空字符

find_replace nul character in R

唯一最接近我的问题的是:are-there-raw-strings-in-r 然而,这对我的帮助还不够。

问题

我在数据框中有一个类似于 Windows 的格式化路径:

data.frame(path = c("X:_aim_seq.R", "X:_aim_seq.R", "X:_aim_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("[=13=]", "##", "X:_aim_seq.R")
# Error: nul character not allowed (line 1)

我已经找到的是使用 r"()" 格式化选项打印路径的方法,它给出:

> r"(X:_aim_seq.R)"
[1] "X:_aim_seq.R"

这样我的最终解决方案将接近于:

tmp_path <- str_replace_all(string = r"(X:_aim_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:)", "")
}

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

一种方法是在 eval(parse(text = ...)):

中使用 gsub()
dat <- data.frame(path = c("X:_aim_seq.R", "X:_aim_seq.R", "X:_aim_seq.R", "X:_aim_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 (v2.0.1)

于 2021-08-23 创建

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

dat <- data.frame(path = c("X:_aim_seq.R", "X:_aim_seq.R", "X:_aim_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 (v2.0.1)

于 2021-08-23 创建