Unicode不等号在Windows环境下的R中变为等号



这听起来像是一个简单的问题,但我怎么也解决不了。我想打印,最好是用knitr::kable()函数,一个数据帧,其中包含一个字符串与'大于或等于号'(或相反的一个)在R中,但符号被转换为'等于(=)'的符号打印时。我将先给你看这个问题,然后我已经做了什么来试图找到答案。

library(knitr)
minimal.example <- data.frame(x= "≥10",y="≤20")
# note: same results with data.frame(x="U2265 10", y="U2264 20")
knitr::kable(minimal.example)

输出:

= 20

所以,根据对我上面问题的评论:我认为直到windows下支持R中的UTF-8(见这里),这个问题仍然会出现,没有通用的解决方案,我们必须围绕这个问题工作。

解决方案1,如@JosefZ提出的:您可以尝试使用CP437编码,它具有我需要的特殊符号,使用Sys。setlocale函数(English_United Kingdom.437)。缺点是:它对其他特殊字符有更多的限制,所以它不是在所有情况下都有效。查看这里支持哪些字符

解决方案2:使用正则表达式将符号替换为latex等效符号似乎在特定情况下有效,特别是对于knitr:: able()表。虽然有点长,但字符也应该用美元符号括起来,例如$\\leq$。此外,在基本的R数据框架中,标题比普通的要好。注意:此解决方案不适用于tibble(x="≥10",y="≤20"),仅适用于tibble(x="U2265 10", y="U2264 20")。当您读取具有任何readrread_excel函数的表时,它似乎可以工作,这就是我需要使用它的方式。

library(knitr)
library(dplyr)
library(stringr)
minimal.example <- dplyr::tibble(x="U2265 10", y="U2264 20")
adjusted.data <- minimal.example %>% 
mutate(across(everything(), ~str_replace_all(., "U2264", "\\leq")
)) %>% 
mutate(across(everything(), ~str_replace_all(., "U2265", "\\geq")
)) %>% 
mutate(across(everything(), 
~ifelse(
str_detect(., "\\leq|\\geq"),
trimws(paste0("$", ., "$")),
.
)
)
)
knitr::kable(adjusted.data)

这给出了下面的html表作为输出,并在(R)降价环境中正确呈现:

<table>
<thead>
<tr>
<th style="text-align:left;"> x </th>
<th style="text-align:left;"> y </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"> $geq 10$ </td>
<td style="text-align:left;"> $leq 20$ </td>
</tr>
</tbody>
</table>

任何改进或更好的答案都是非常感谢的。

最新更新