R中数字转义字符的行为不一致

时间:2019-04-15 21:09:59

标签: r escaping

我无意中遇到了这个问题,想知道是否对此有一个解释。在一个玩具示例中,我将转义字符置于可变级别。

  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为例。 所以我的问题是,为什么要假设我希望1\2评估为1\002

我应该不会因为我没有明确写1\002(因为从技术上说\2不是转义字符)而抛出错误吗?

1 个答案:

答案 0 :(得分:2)

我只想稍微介绍一下@joran的答案。 ?Quote在提到octal code

时确实(在某种程度上)给出了原因。
  

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

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

> 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()是对此进行思考的另一种方式:

  

以八进制格式转换或打印整数,以显示最大数所需的位数,并根据需要使用前导零。

 > as.octmode("002")
 [1] "2"