为什么在R中有些Unicode字符能在矩阵中显示,但不能在数据框中显示?

29

对于至少一些情况,如果亚洲字符包含在一个矩阵向量中,则可以打印出来,但不包含在数据框中。下面是一个例子:

q<-'天'

q # Works
# [1] "天" 

matrix(q) # Works
#      [,1]
# [1,] "天"

q2<-data.frame(q,stringsAsFactors=FALSE) 
q2 # Does not work
#          q
# 1 <U+5929>

q2[1,] # Works again.
# [1] "天"

显然,我的设备可以显示该字符,但当它在data.frame中时,它不起作用。

经过一番调查,我发现print.data.frame函数对每列运行format。结果发现,如果直接运行format.default,同样会出现这个问题:

format(q)
# "<U+5929>"
挖掘format.default,我发现它调用了用C编写的内部 format
在进一步挖掘之前,我想知道其他人是否能够重现这种行为。 是否存在某种R配置,可以允许我在data.frame中显示这些字符? 如果有帮助,我的sessionInfo()如下:
R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_Canada.1252  LC_CTYPE=English_Canada.1252   
[3] LC_MONETARY=English_Canada.1252 LC_NUMERIC=C                   
[5] LC_TIME=English_Canada.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.0.1

1
尝试设置 Sys.setlocale( locale="UTF-8" )。渲染不一致有点奇怪;然而,English_Canada.1252 并不打算处理亚洲字符。 - Kevin Ushey
2个回答

22

很不情愿自己回答这个问题,但是尽管评论和答案有所帮助,它们并不完全正确。在Windows中,似乎无法设置通用的“UTF-8”区域设置。然而,您可以设置特定于国家/地区的区域设置,在这种情况下将起作用:

Sys.setlocale("LC_CTYPE", locale="Chinese")
q2 # Works fine
#  q
#1 天

但是,这确实让我想知道为什么format似乎使用了locale; 我想知道在Windows中是否有一种忽略locale的方法。我也想知道在Windows上是否有一些通用的UTF-8 locale,我不知道。


如果有人想详细解释一下这里发生了什么,我会在一段时间内保持开放状态,然后再检查我的答案。 - nograpes
1
我刚刚发现了这个问题,并根据Duncan Murdoch的说法,这是一个错误(尽管很难修复)。https://stat.ethz.ch/pipermail/r-devel/2015-May/071252.html - Richie Cotton
@RichieCotton 啊!我知道这是个bug。谢谢你让我知道。 - nograpes
完成后我们需要改回来吗?还是当您重新启动R时,它会自动更改回去? - Hack-R
Sys.setlocale("LC_CTYPE", locale="Persian") 也适用于波斯语。 - AmiNadimi

6

几天前我刚刚发表了一篇关于Unicode和R的博客。我认为你的R编辑器是UTF-8编码,这让你产生了一种错觉,认为在Windows中处理UTF-8字符的R没有问题。

简短的答案是:当你想要处理Unicode(例如中文)时,不要使用英文版的Windows,而应该使用默认为UTF-8编码的中文版Windows或Linux。

以下是我Ubuntu系统的会话信息:

> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: i686-pc-linux-gnu (32-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

@nograpes,在我的Ubuntu和RStudio中,没有这样的显示问题。 - Yin Zhu
有趣。你能发布你的 sessionInfo() 吗?这样我就可以比较和对比我们的配置了。 - nograpes
我错了,在Ubuntu下无法重现问题。然而,尽管如此有所帮助,但它并不能解释是否存在一种在Windows下的R配置可以解决该问题。 - nograpes
我使用的是CentOS 6.3,但是我也无法按照这篇文章设置语言环境。然而,我的sessionInfo()部分支持Unicode,部分不支持。 - wdkrnls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接