【问题标题】:Inconsistent behavior with numeric escape characters in RR中数字转义字符的行为不一致
【发布时间】:2019-04-15 21:09:59
【问题描述】:

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

  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?不应该因为我没有明确写1\002而引发错误(因为\2在技术上不是转义字符)?

【问题讨论】:

  • 我猜如果你眯着眼睛,你可能会争辩说这种行为记录在 ?Quotes 中,对于八进制字符代码,并且 R 不会翻译任何低于 040 的内容?
  • ...我收回这一点,040 以下的某些内容已被翻译,但我想其中一些不是,或者当我只是在控制台上打印它们时没有意义。

标签: r escaping


【解决方案1】:

我只是想稍微清除一下@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"

【讨论】:

  • 感谢您的回答。有趣的是,如果您不包括它们,R 会假定前导 0。或者至少我认为这很有趣,因为 '\020''\002' 都是单独的代码,所以我不希望 R 假设用户总是希望附加前导 0。
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2021-07-07
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多