我希望能够比较两个公式。我想知道使用identical()
,==
或解除公式的等式的优点/缺点/陷阱。
考虑例如
xx <- ~0
environment(xx) <- new.env()
xx == ~0
返回TRUE
identical(xx, ~0)
和identical(xx, ~0, ignore.environment=TRUE)
返回FALSE
(ignore.environment
参数仅在比较闭包时应用)deparse(xx) == "~0"
返回TRUE
(但贬低几乎总是一个坏主意......)为了清楚起见,我希望公式在语义上是等价的;我不关心他们的环境。如果能够进行公式扩展并忽略术语的顺序(例如~a*b
和~b+a+a:b
将是相同的),那将是一个奖励,但这太过于担心兔子洞了。只要~a+b
(环境1)和~b+a
(环境2)相同,我将选择~a+b
和~a+b
不相等。
我确实想要编写一个比较函数,用emptyenv()
替换两个值的环境,然后使用identical()
,但这似乎是错综复杂的。
是否有边缘情况/原因我不应该只在这里使用==
?
当identical
返回FALSE
我总是尝试all.equal
,它不那么严格。引用其帮助页面:
all.equal(x, y)
是一个实用程序来比较R对象x
和y
测试'近似平等'。如果它们不同,仍然会在一定程度上进行比较,并返回差异报告。
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