在R中使用数字转义字符时出现不一致的行为

4

我无意中遇到了这个问题,想知道它的解释。在一个玩具示例中,我把转义字符放在了变量级别。

  library(dplyr)
  library(gt)
    mt2 <- mutate(mtcars, cylx = ifelse(cyl == 4, "1\2", "2/3"))

一开始我以为当cyl为4时它会简单地跳过'2'。然而,1\2 实际上被评估为 1\002。当使用 View(mt2) 时,你看不到它,但是当你尝试打印表格 gt::gt(mt2) 时,它将评估为特殊字符。所有的打印选项都会显示,但我用gt作为例子。

所以我的问题是,为什么r认为我想让1 \ 2评估为1 \ 002 ?难道R应该抛出错误,因为我没有明确写出1 \ 002(因为\2技术上不是转义字符)?


1
我猜如果你眯起眼睛看,你可能会认为这种行为在?Quotes中有所记录,对于八进制字符代码,R就是不会翻译040以下的任何内容? - joran
1
我收回之前的说法,一些小于040的东西已经被翻译了,但我想有些并没有被翻译或者在我只是将它们打印到控制台时没有意义。 - joran
1个回答

2
我只是想进一步阐述@joran的回答。当?Quote提到八进制代码时,它(有点)给出了原因。

\ nnn 具有给定八进制代码的字符(1、2或3个数字)

因此,在\之后添加三位八进制代码将产生相应的数字/字符:

最初的回答

> c('\110' ,'\074', '\076') 
 [1] "H" "<" ">" 

当你提供'\002'时,就像链接所示,你将得到八进制代码002。此外,R不需要您为这些八进制代码提供前导0。 R只是假设你想包含它们。最初的回答。
 > c('\110' ,'\74', '\76')
 [1] "H" "<" ">" 

 > '\2' == '\002'
 [1] TRUE 

 > '\2' == '\02' 
 [1] TRUE

as.octmode()的另一种思考方式:

将整数转换或打印成八进制格式,使用尽可能多的数字以显示最大值,并在必要时使用前导零。

"Original Answer"翻译成"最初的回答"。
 > as.octmode("002")
 [1] "2"

谢谢你的回答。有趣的是,如果你不包含前导0,R会假定它们存在。至少我认为这很有趣,因为'\020''\002'都是单独的代码,所以我不希望R假定用户总是想要附加前导0。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接