Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 替换窗口上的特殊符号_R_Regex_R Markdown - Fatal编程技术网

R 替换窗口上的特殊符号

R 替换窗口上的特殊符号,r,regex,r-markdown,R,Regex,R Markdown,学生通常将pdf或word文档中的作业问题粘贴到Rmarkdown中。然而,粘贴的文本通常有非ascii字符作为项目符号、引号等。我过去曾使用gsub作为函数的一部分来替换这些字符,这似乎很好,但现在我又遇到了问题 下面显示的每一对中的第一行都适用于macOS、Linux和Windows。但是,R包中不允许包含代码中的非ascii字符。每对中的第二行适用于macOS和Linux,但不适用于Windows 如果有一个通用的方法来处理这些类型的字符,而不需要简单地删除它们,那将是非常棒的 gsub(

学生通常将pdf或word文档中的作业问题粘贴到Rmarkdown中。然而,粘贴的文本通常有非ascii字符作为项目符号、引号等。我过去曾使用
gsub
作为函数的一部分来替换这些字符,这似乎很好,但现在我又遇到了问题

下面显示的每一对中的第一行都适用于macOS、Linux和Windows。但是,R包中不允许包含代码中的非ascii字符。每对中的第二行适用于macOS和Linux,但不适用于Windows

如果有一个通用的方法来处理这些类型的字符,而不需要简单地删除它们,那将是非常棒的

gsub("•", "*", "A big dot •")
gsub("\xE2\x80\xA2", "*", "A big dot •")

gsub("…", "...", "Some small dots …")
gsub("\xE2\x80\xA6", "...", "Some small dots …")

gsub("–", "-", "A long-dash –")
gsub("\xE2\x80\x93", "-", "A long-dash –")

gsub("’", "'", "A curly single quote ’")
gsub("\xE2\x80\x99", "'", "A curly single quote ’")

gsub("‘", "'", "A curly single quote ‘")
gsub("\xE2\x80\x98", "'", "A curly single quote ‘")

gsub("”", '"', "A curly double quote ”")
gsub("\xE2\x80\x9D", '"', "A curly double quote ”")

gsub("“", '"', "A curly double quote “")
gsub("\xE2\x80\x9C", '"', "A curly double quote “")

我们可以使用
编码功能检查字符的十六进制编码:

x <- c("•", "…", "–", "’", "‘", "”", "“")
y <- x

Encoding(y) <- "bytes"

> x
[1] "•" "…" "–" "’" "‘" "”" "“"

> cat(y)
\x95 \x85 \x96 \x92 \x91 \x94 \x93
也可使用
stri\u trans\u general
from
stringi

library(stringi)
stri_trans_general(x, "ascii")
# [1] "•"   "..." "-"   "'"   "'"   "\""  "\""
这似乎不适用于
“•”
,但适用于其余部分


请注意,我只在Windows上测试了此解决方案,而没有在其他操作系统上测试。

在具有非美国语言设置的系统上,
gsub(“[\x95\xE2\x80\xA2]”、“*”、“大点•”)
可能会导致错误(请参见下面的示例)

此外,
stringi::stri_trans_general
在具有美国语言设置的系统上运行良好,但在具有中文设置的系统上,下面显示的代码不会返回所需的结果,这只是夹. 不确定解决方案是什么

stringi::stri_trans_general("夹", "ascii")
> stringi::stri_trans_general("夹", "ascii")
[1] " 1/4D"

这看起来非常有用@avid_userR
stri_trans_general
可能会做我需要的事情(需要更多的测试。我试过“大点”
gsub([\x95\xE2\x80\xA2],“*”,“大点”•)
但它似乎在Windows或macOS上不起作用。你能确认它在你的系统上起作用吗?@Vincent它在我的机器上起作用,我有Windows 10 Enterprise 64位。当你
cat(“•”)
它是否显示了
“\x95”
?它显示了。我仔细检查了我的代码,发现我没有将代码包装在[…]中。添加代码后,它似乎运行良好。谢谢!@avid\u userR对我刚刚发布的答案/编辑有任何评论吗?如果更合适的话,我可以将第二部分变成一个新问题。@Vincent对不起,第二部分是什么?
> gsub("[\x95\xE2\x80\xA2]", "*", "A big dot •") 
Error in gsub("[曗€", "*", "A big dot <U+2022>") : 
  invalid regular expression '[曗€', reason 'Missing ']''
gsub("\u2022", "*", "A big dot •")
gsub("\u2026", "...", "Some small dots …")
gsub("\u2013", "-", "A long-dash –")
gsub("\u2019", "'", "A curly single quote ’")
gsub("\u2018", "'", "A curly single quote ‘")
gsub("\u201D", '"', "A curly double quote ”")
gsub("\u201C", '"', "A curly double quote “")
stringi::stri_trans_general("夹", "ascii")
> stringi::stri_trans_general("夹", "ascii")
[1] " 1/4D"