反斜杠转义的数字 '\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
从 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