【问题标题】:How does R handle Unicode / UTF-8?R 如何处理 Unicode / UTF-8?
【发布时间】:2015-04-13 12:59:17
【问题描述】:

如果我写

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

然后我可以包含U+394,只要它包含在反引号中。 (相比之下,Δ &lt;- function(a,b) (a-b)/aunexpected input in "�" 失败。)所以显然 R 解析 UTF-8 或 Unicode 或类似的东西。作业进展顺利,eg 的评估也进展顺利

`Δ`(1:5, 9:13)

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

最后,如果我定义了 winsorise &lt;- function(x, λ=.05) { ... } 之类的东西,那么 λ (U+3bb) 不需要 需要用反引号“引入”R。然后我可以毫无问题地拨打winsorise(data, .1)


在 R 的文档中,我能找到的唯一一个 unicode 的 mention 已经超出了我的想象。理解它的人能否更好地向我解释一下——当 R 需要 ` 来理解分配给♔但可以解析 ♔(a,b,c) 时,“幕后”发生了什么?

【问题讨论】:

  • 在 R 内部:R 用户认为的变量或对象是绑定到值的符号。我认为您链接到的 CHARSXP 部分是值,您实际上对符号规则感兴趣。也就是说,我一直在编写用中文编写的 R 代码,所以我希望 delta 能够工作。
  • 您使用的是什么版本的 R/什么操作系统/什么语言环境?将函数分配给Δ 时出现“错误:\uxxxx 序列不支持在反引号内(第 1 行)”(在今天的 R-devel 和 Win 7 下的 3.1.0 上测试,英国英语语言环境。)
  • 您使用的是哪个版本的 R,Δ &lt;- function(a,b) (a-b)/a 失败?当你说它“失败”时,你是什么意思?你有语法错误吗?如果在R version 3.1.0, x86_64-apple-darwin10.8.0 (64-bit) locale en_US.UTF-8 上为我工作
  • @MrFlick @RichieCotton 3.1.2 “南瓜头盔”,Error: unexpected input in "�" 说。
  • Δ 在R version 3.1.1 (2014-07-10) Platform: x86_64-w64-mingw32/x64 (64-bit)上对我不起作用

标签: r unicode utf-8


【解决方案1】:

我无法谈论函数调用与函数参数的幕后情况,但 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”给出了一个希腊小测试版,“\u2642”给出了一个“男性符号”。这样的字符串将被打印为例如&lt;U+2642&gt; 除了在 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  

【讨论】:

  • 感谢您进行所有这些研究。就 UTF-8 而言,我不知道 Windows 和 Linux 之间存在如此显着的差异,但这解释了那些评论失败的人。 (我很高兴知道 32 位比 Windows 更不可能导致错误。)
  • 感谢@isomorphismes。我只是稍微编辑了它以使其更加连贯,但那里有相同的基本信息。总而言之:任何与 unicode 相关的怪异几乎都是 Windows 的错,但这与 32 位和 64 位无关。这都是关于 UTF-8 与 UCS-2 的对比(仅供参考,如果您进一步阅读,UCS-2 也称为“带有 BOM 的 UTF-16LE”)。
  • @isomorphismes Under R 3.1.2 (Win 7 64 bit) get("Δ")(1,2) 将正常执行
【解决方案2】:

作为记录,在 R-devel (2015-02-11 r67792)、Win 7、English UK locale 下,我看到了:

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 "Δ"

【讨论】:

  • 好有趣。我没想到这会因版本而异。
猜你喜欢
  • 2015-04-29
  • 2018-08-26
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2010-12-26
  • 2010-09-17
  • 2010-09-21
相关资源
最近更新 更多