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

What do backslash-escaped numbers '\1' to '\7' mean in R strings, and why do they compare wrongly?

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

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

'' == '' # FALSE
'' <  '' # FALSE
'' >  '' # FALSE
'' <= '' # TRUE
'' >= '' # 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

他们是octal constants/literals for ASCII characters"Backslashes followed by up to three numbers are interpreted as octal notation for ASCII characters"

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

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

> charToRaw('')
[1] 01
> charToRaw('')
[1] 02
> charToRaw('1')
[1] 31
> charToRaw('2')
[1] 32
> charToRaw('[=10=]1')
[1] 01
> charToRaw('[=10=]2')
[1] 02
  • 如果你的意思是 "backslash-escaped",请不要说 "shell-escaped"。不要假设 R 对待转义与 Unix 相同 shell;他们是不同的。
  • 是的,我同意你发现的 </==/> 比较行为很奇怪且不一致,我确认我在 MacOS 上的 R 3.5.1 中得到了相同的结果 en_US.UTF-8.
  • 但我不知道 R 语言是否保证对小数点后 32 位以下不可打印的 ASCII 常量进行字符串顺序比较("collation order"/"collating sequence";自从 Fortran 回到1960 年代)。也许最多值得一个小错误。大多数语言规范都会警告您,弄乱任何低于 32 的 ASCII 值都会导致 strange/undefined 行为。
  • 有关更多信息,请键入 ?base::Quotes 或参阅 R Language Definition : 10.3.1 Constants : Octal Characters