如果我写
`Δ` <- function(a,b) (a-b)/a
然后我可以包含U+394
,只要它包含在反引号中。 (相比之下,Δ <- function(a,b) (a-b)/a
以unexpected 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)?
答案 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 "Δ"