R如何处理Unicode / UTF-8?

时间:2015-02-12 17:03:16

标签: r unicode utf-8

如果我写

`Δ` <- function(a,b)   (a-b)/a 

然后我可以包含U+394,只要它包含在反引号中。 (相比之下,Δ <- function(a,b) (a-b)/aunexpected input in "�"失败。)显然,R会解析UTF-8或Unicode或类似的东西。任务进展顺利,例如

的评估也是如此
`Δ`(1:5, 9:13)

。我也可以评估Δ(1:5, 9:13)

最后,如果我定义了类似winsorise <- function(x, λ=.05) { ... }的内容,则λ(U+3bb不需要通过反引号“引入”R。然后,我可以毫无问题地致电winsorise(data, .1)


我可以找到关于unicode的R文档中唯一的mention。理解它的人能否更好地向我解释 - 当R需要`来理解对assignment的赋值时,“引擎盖下”会发生什么,但是一旦分配了就可以解析♔(a,b,c)?

2 个答案:

答案 0 :(得分:4)

我无法谈论有关函数调用与函数参数的内幕情况,但2008年的this email from Prof. Ripley可能会有所启示(摘录如下):

  

R传递,打印和绘制UTF-8字符数据非常好,但它转换为几乎所有字符级操作的本机编码(而不仅仅是在Windows上)。 ?Encoding说明例外情况[...]

the documentation that the OP linked to中提到了R进行此翻译的原因(至少在Windows上):

  

Windows没有UTF-8语言环境,但希望使用UCS-2字符串。 R(用标准C编写)在没有大量更改的情况下不能在UCS-2内部工作。

?Quotes的R文档解释了如何有时使用场外字符(强调添加):

  

标识符由一系列字母,数字,句点(。)和下划线组成。它们不能以数字或下划线开头,也不能以句点后跟数字开头。保留字不是有效的标识符。

     

字母的定义取决于当前的区域设置,但只有ASCII数字被视为数字。

     

这种标识符也称为语法名称,可以直接在R代码中使用。几乎总是,可以使用其他名称,只要它们被引用。首选引号是反引号(`),而deparse通常会使用它,但在许多情况下可以使用单引号或双引号(因为字符常量通常会转换为名称)。反引号可能必不可少的一个地方是在公式中分隔变量名称:参见公式。

还有另一种获取此类字符的方法,即使用unicode转义序列(如\u0394代表Δ)。如果您将该字符用于绘图上的文本以外的其他任何内容(例如,不要对变量或函数名称执行此操作;参见the R 2.7 release notes中的此引用,当大部分内容时,这通常是一个坏主意。添加了当前的UTF-8支持):

  

如果呈现给解析器的字符串在当前语言环境中包含\ uxxxx转义无效,则字符串将以UTF-8记录,并声明编码。 如果稍后在会话中使用它可能会引发错误,但可以打印,并用于例如在windows()设备上绘图。所以“\ u03b2”给出一个希腊小beta和“\ u2642”一个'男性标志'。这样的字符串将被打印为例如<U+2642>除了在Rgui控制台中(见下文)。

我认为这解决了大部分问题,但我不知道为什么你给出的函数名和函数参数示例之间存在差异;希望有更多知识渊博的人可以参与其中。仅供参考,在Linux上,所有这些分配和调用函数的方式都可以正常工作(因为系统区域设置是UTF-8,所以不需要进行翻译):

Δ <- function(a,b) (a-b)/a         # no error
`Δ` <- function(a,b) (a-b)/a       # no error
"Δ" <- function(a,b) (a-b)/a       # no error
"\u0394" <- function(a,b) (a-b)/a  # no error
Δ(1:5, 9:13)        # -8.00 -4.00 -2.67 -2.00 -1.60
`Δ`(1:5, 9:13)      # same
"Δ"(1:5, 9:13)      # same
"\u0394"(1:5, 9:13) # same

sessionInfo()

# R version 3.1.2 (2014-10-31)
# Platform: x86_64-pc-linux-gnu (64-bit)

# locale:
# LC_CTYPE=en_US.UTF-8    LC_NUMERIC=C                LC_TIME=en_US.UTF-8
# LC_COLLATE=en_US.UTF-8  LC_MONETARY=en_US.UTF-8     LC_MESSAGES=en_US.UTF-8
# LC_PAPER=en_US.UTF-8    LC_NAME=C                   LC_ADDRESS=C
# LC_TELEPHONE=C          LC_MEASUREMENT=en_US.UTF-8  LC_IDENTIFICATION=C

# attached base packages:
# stats  graphics  grDevices  utils  datasets  methods  base  

答案 1 :(得分:2)

为了记录,在R-devel(2015-02-11 r67792),Win 7,英国英国语言环境下,我看到:

options(encoding = "UTF-8")

`Δ` <- function(a,b) (a-b)/a 
## Error: \uxxxx sequences not supported inside backticks (line 1)

Δ <- function(a,b) (a-b)/a
## Error: unexpected input in "\"

"Δ" <- function(a,b) (a-b)/a      # OK

`Δ`(1:5, 9:13)
## Error: \uxxxx sequences not supported inside backticks (line 1)

Δ(1:5, 9:13)
## Error: unexpected input in "\"

"Δ"(1:5, 9:13)
## Error: could not find function "Δ"