如何最好地比较公式?

问题描述 投票:4回答:1

我希望能够比较两个公式。我想知道使用identical()==或解除公式的等式的优点/缺点/陷阱。

考虑例如

xx <- ~0
environment(xx) <- new.env()
  • xx == ~0返回TRUE
  • identical(xx, ~0)identical(xx, ~0, ignore.environment=TRUE)返回FALSEignore.environment参数仅在比较闭包时应用)
  • deparse(xx) == "~0"返回TRUE(但贬低几乎总是一个坏主意......)

为了清楚起见,我希望公式在语义上是等价的;我不关心他们的环境。如果能够进行公式扩展并忽略术语的顺序(例如~a*b~b+a+a:b将是相同的),那将是一个奖励,但这太过于担心兔子洞了。只要~a+b(环境1)和~b+a(环境2)相同,我将选择~a+b~a+b不相等。

我确实想要编写一个比较函数,用emptyenv()替换两个值的环境,然后使用identical(),但这似乎是错综复杂的。

是否有边缘情况/原因我不应该只在这里使用==

r formula
1个回答
1
投票

identical返回FALSE我总是尝试all.equal,它不那么严格。引用其帮助页面:

all.equal(x, y)是一个实用程序来比较R对象xy测试'近似平等'。如果它们不同,仍然会在一定程度上进行比较,并返回差异报告。

xx <- ~0
environment(xx) <- new.env()

all.equal(xx, ~0)
#[1] TRUE

但在if声明中,这不应该按原样使用,正确的方法是isTRUE(all.equal(.))。再次来自文档:

如果表达式,请不要直接使用all.equal - 如果合适,可以使用isTRUE(all.equal(....))identical

isTRUE(all.equal(xx, ~0))
#[1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.