== 与公式的奇怪行为

Posted

技术标签:

【中文标题】== 与公式的奇怪行为【英文标题】:Strange behaviour of == with formula 【发布时间】:2022-01-20 08:45:25 【问题描述】:

我对以下内容感到有些困惑。我有两个公式,想检查它们是否相同。在这里,我希望返回 FALSE。

fm1 <- formula(schades ~ termijn + zipcode + provincie + regionvormgemeente + energielabel + trede)
fm2 <- formula(schades ~ termijn + zipcode + provincie + regionvormgemeente + energielabel)
fm1 == fm2
#> [1] TRUE

identical(fm1, fm2)
#> [1] FALSE

fm1 == fm2 返回 TRUE 的原因是什么?

由reprex package (v2.0.1) 于 2021 年 12 月 17 日创建

【问题讨论】:

这能回答你的问题吗? What's the difference between identical(x, y) and isTRUE(all.equal(x, y))? 【参考方案1】:

== 旨在比较原子向量中的值,而不是公式。

此外,请参阅?== 中的以下示例:

x1 <- 0.5 - 0.3
x2 <- 0.3 - 0.1
x1 == x2                   # FALSE on most machines
isTRUE(all.equal(x1, x2))  # TRUE everywhere

应用到您的示例中,您可以找到:

    > fm1 <- formula(schades ~ termijn + zipcode + provincie + regionvormgemeente + energielabel + trede)
> fm2 <- formula(schades ~ termijn + zipcode + provincie + regionvormgemeente + energielabel)
> fm1 == fm2
[1] TRUE
> 
> all.equal(fm1, fm2)
[1] "formulas differ in contents"
> isTRUE(all.equal(fm1,fm2))
[1] FALSE

但显然减少预测变量的数量会返回预期结果。它只是说明 == 不应该用于这种类型的比较,因为它的行为不连贯:

> fm1 <- formula(schades ~ termijn + zipcode + provincie)
> fm2 <- formula(schades ~ termijn + zipcode)
> fm1 == fm2
[1] FALSE
> isTRUE(all.equal(fm1,fm2))
[1] FALSE

【讨论】:

== 给出了意想不到的(不正确的)答案似乎是一个问题。也许 r 为这个比较返回一个错误会更好【参考方案2】:

来自?Comparison/Details:"...符号和调用等语言对象在比较之前被解析为字符串..."

所以,在比较之前发生的是:

deparsefm1 = deparse(fm1)
deparsefm2 = deparse(fm2)

然后,比较 deparsed 语言对象。

不过,这里有趣的是,R 在内部 (i) 仅选择已解析对象的第一个元素进行比较,并且 (ii) 默认情况下不使用限制数量的 deparse 选项生成的元素(而deparse 提供了这种灵活性——例如查看deparse(fm1, 100) == deparse(fm2, 100) 的行为方式)。所以,虽然,我们会期望

deparse(fm1) == deparse(fm2)
#[1]  TRUE FALSE

实际上,我们得到了

deparse(fm1)[[1]] == deparse(fm2)[[1]]
#[1] TRUE

我认为“为什么会这样”是个好问题。

【讨论】:

以上是关于== 与公式的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

Excel 表格验证/公式未复制到新表格行

一个公式竟然破解了年轻人的行为“密码”

如何在 CSDN 的 MarkDown 中编辑数学公式

拟合的 coxph 模型随时间变化的地层和集群的公式中的项排序而变化

Sql:Haversine 公式错误列不存在

Excel VBA 函数失败,但公式在工作表中有效