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 创建
唯一最接近我的问题的是: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 创建