r - 如何最好地比较公式?
问题描述
我希望能够比较两个公式。我想知道使用 , 或 deparsed 公式的相等性的优点/缺点/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
(但 deparsing 几乎总是一个坏主意......)
为了清楚起见,我希望公式在语义上是等价的;我不在乎他们的环境。能够进行公式扩展并忽略术语的顺序(例如,so~a*b
和~b+a+a:b
将是等价的)将是一个额外的好处,但这太麻烦了。只要(环境 1)和(环境 2)相同~a+b
,我就会满足于不等价。~b+a
~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
直接在 if 表达式中使用——使用isTRUE(all.equal(....))
或者identical
如果合适的话。
isTRUE(all.equal(xx, ~0))
#[1] TRUE
推荐阅读
- fast-ai - 将变换应用于 fastai v2 视觉
- arrays - 通过将其作为函数参数传递来填充 2d 子数组
- python - 我如何知道数据并且没有相同的形状或不在 python 中使用 seaborn 命令?
- systemc - TLM-2.0 和 SystemC-2.3.3 版本
- python - 将一个函数的参数应用于另一个函数,而无需手动输入所有内容
- caddy - 如何用 caddy 定义默认文件?
- ssas - 在使用除法对计算度量进行排名时,MDX 中缺少排名值
- c - 创建结构期间可能出现分段错误 | C
- java - 来自maven的各种Apache库的最新依赖版本突然使用了一个非常旧的版本
- reactjs - Redux:如何在另一个值更改时更新一个值?