R字符串中的反斜杠转义数字'\ 1'到'\ 7'是什么意思,为什么它们比较不正确?

时间:2019-03-17 01:51:31

标签: r string literals octal

从1到7的反斜杠转义数字在打印时似乎没有任何作用。

我很好奇R如何解释它们,部分原因是它们似乎遵循一些奇怪的比较规则:

'\1' == '\2' # FALSE
'\1' <  '\2' # FALSE
'\1' >  '\2' # FALSE
'\1' <= '\2' # TRUE
'\1' >= '\2' # TRUE

编辑:行为似乎与平台有关,所以这是我的sessionInfo

R version 3.5.2 (2018-12-20)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Arch Linux

Matrix products: default
BLAS: /usr/lib/libopenblasp-r0.3.5.so
LAPACK: /usr/lib/liblapack.so.3.8.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] 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
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

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

loaded via a namespace (and not attached):
[1] compiler_3.5.2

1 个答案:

答案 0 :(得分:3)

它们是octal constants/literals for ASCII characters“反斜杠后跟最多三个数字将被解释为ASCII字符的八进制符号”

\ 1表示\ 001,\ 2表示\ 002等;这两个都是unprintable control characters (SOM and EOA, to be precise)它们不等同于字符串“ 1”,“ 2”,我想您假设它们是或应该是。

您可以通过以下方式查看其实际原始数值:

> charToRaw('\1')
[1] 01
> charToRaw('\2')
[1] 02
> charToRaw('1')
[1] 31
> charToRaw('2')
[1] 32
> charToRaw('\001')
[1] 01
> charToRaw('\002')
[1] 02
  • 如果您的意思是“反斜杠转义”,请不要说“ shell转义”。不要假设R对待转义与Unix shell一样;他们是不同的。
  • 是的,我同意您发现的</==/>比较行为很奇怪且不一致,我确认在Mac OS的R 3.5.1中,在语言环境en_US.UTF-8中得到了相同的结果。
  • 但是我不知道R语言是否可以保证对32位十进制以下的不可打印ASCII常数进行字符串顺序比较(“排序顺序” /“排序顺序”;这是自1960年代Fortran以来的事情)。也许最多值得一个小错误。大多数语言规范都警告您,如果将任何ASCII值设置为32以下,都会产生奇怪/不确定的行为。
  • 有关更多信息,请输入?base::Quotes或查看R Language Definition : 10.3.1 Constants : Octal Characters