37

isTRUE(all.equal(x, y))テストとの違いはありますidentical(x, y)か?

ヘルプページには次のように書かれています。

「if」式で「all.equal」を直接使用しないでください。必要に応じて「isTRUE(all.equal(....))」または「identical」を使用してください。

しかし、その「適切な場合」には疑問が残ります。2つのうちどちらが適切かをどのように判断しますか?

4

3 に答える 3

33

all.equalほぼ等しいかどうかをテストしますidenticalが、より正確です(たとえば、差異に対する許容度がなく、ストレージタイプを比較します)。同一から:

関数'all.equal'は、この方法で同等性をテストするために使用されることもありますが、別の目的で使用されていました。これにより、数値結果にわずかな違いが生じる可能性があります。

そして、あなたがラップall.equalする理由の1つは、単にを返すのではなく、違いを報告isTRUEするからです。all.equalFALSE

于 2010-08-03T11:35:57.727 に答える
19

では、 とは異なり、数値許容差とストレージ モードの比較の違いに加えてall.equal()identical関連する環境の同等性もテストします。通常、R の通常のオブジェクトには環境が関連付けられていません。最も一般的にはfunctionand formula(and terms) オブジェクトに関連付けられています。しかし、説明のために、2 つの単純なオブジェクトに異なる (新しく作成された) 環境を与えます。

x <- 2; environment(x) <- new.env()
y <- 2; environment(y) <- new.env()
all.equal(x,y)   ## TRUE
identical(x,y)   ## FALSE

引数がありignore.environmentます:

ignore.environment: クロージャーを比較するときに環境を無視する必要があるかどうかを示す論理。

しかし、これはクロージャー (つまり関数) を比較する場合にのみ適用されるため、この場合は違いがありません。また、式や用語オブジェクトを比較する場合も違いはありません。

于 2015-10-11T23:54:59.083 に答える
18

identical面倒です。例えば:

> identical(as.double(8), as.integer(8))
[1] FALSE
> all.equal(as.double(8), as.integer(8))
[1] TRUE
> as.double(8) == as.integer(8)
[1] TRUE
于 2010-08-03T11:38:59.890 に答える