== 与公式的奇怪行为
Strange behaviour of == with formula
下面的我有点不解。我有两个公式,想检查它们是否相同。在这里我希望返回 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
returns 正确的原因是什么?
由 reprex package (v2.0.1)
于 2021-12-17 创建
==
旨在比较原子向量中的值,而不是公式。
此外,请参阅 ?==
中的以下示例:
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
但显然减少了 returns 预期结果的预测变量数量。它只是说明 ==
不应该用于这种类型的比较,因为它的行为不连贯:
> fm1 <- formula(schades ~ termijn + zipcode + provincie)
> fm2 <- formula(schades ~ termijn + zipcode)
> fm1 == fm2
[1] FALSE
> isTRUE(all.equal(fm1,fm2))
[1] FALSE
来自?Comparison
/详情:"...符号和调用等语言对象在比较前被解析为字符串..."
所以,比较之前发生的事情是:
deparsefm1 = deparse(fm1)
deparsefm2 = deparse(fm2)
然后比较 deparse
d 个语言对象。
不过,这里有趣的是,R 在内部 (i) 仅选择已解析对象的第一个元素进行比较,并且 (ii) 默认情况下不使用限制生成的元素数量(而 deparse
提供了这种灵活性——例如,查看 deparse(fm1, 100) == deparse(fm2, 100)
的行为方式)。所以,虽然,我们期望
deparse(fm1) == deparse(fm2)
#[1] TRUE FALSE
我们实际上得到了
deparse(fm1)[[1]] == deparse(fm2)[[1]]
#[1] TRUE
我认为“为什么会这样”是一个很好的问题。
下面的我有点不解。我有两个公式,想检查它们是否相同。在这里我希望返回 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
returns 正确的原因是什么?
由 reprex package (v2.0.1)
于 2021-12-17 创建==
旨在比较原子向量中的值,而不是公式。
此外,请参阅 ?==
中的以下示例:
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
但显然减少了 returns 预期结果的预测变量数量。它只是说明 ==
不应该用于这种类型的比较,因为它的行为不连贯:
> fm1 <- formula(schades ~ termijn + zipcode + provincie)
> fm2 <- formula(schades ~ termijn + zipcode)
> fm1 == fm2
[1] FALSE
> isTRUE(all.equal(fm1,fm2))
[1] FALSE
来自?Comparison
/详情:"...符号和调用等语言对象在比较前被解析为字符串..."
所以,比较之前发生的事情是:
deparsefm1 = deparse(fm1)
deparsefm2 = deparse(fm2)
然后比较 deparse
d 个语言对象。
不过,这里有趣的是,R 在内部 (i) 仅选择已解析对象的第一个元素进行比较,并且 (ii) 默认情况下不使用限制生成的元素数量(而 deparse
提供了这种灵活性——例如,查看 deparse(fm1, 100) == deparse(fm2, 100)
的行为方式)。所以,虽然,我们期望
deparse(fm1) == deparse(fm2)
#[1] TRUE FALSE
我们实际上得到了
deparse(fm1)[[1]] == deparse(fm2)[[1]]
#[1] TRUE
我认为“为什么会这样”是一个很好的问题。