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

问题描述 投票:2回答:1

从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
r string literals octal
1个回答
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-escaped”。不要假设R treats与Unix shell一样逃脱;他们是不同的。
  • 是的我同意你发现的</==/>比较行为很奇怪且不一致,我确认我在语言环境en_US.UTF-8中的MacOS上的R 3.5.1中得到了相同的结果。
  • 但是我不知道R语言是否能保证字符串顺序比较不可压缩的ASCII常量(小数点后32位)(“整理顺序”/“整理顺序”;自从Fortran回到20世纪60年代以来,这就是一个问题)。也许最值得一个小错误。大多数语言规范都警告你,弄乱任何低于32的ASCII值都会产生奇怪/未定义的行为。
  • 有关更多信息,请键入?base::Quotes或查看R Language Definition : 10.3.1 Constants : Octal Characters
© www.soinside.com 2019 - 2024. All rights reserved.