web-dev-qa-db-ja.com

同一(x、y)とisTRUE(all.equal(x、y))の違いは何ですか?

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

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

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

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

32
mariotomo

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

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

また、all.equalisTRUEでラップする理由の1つは、all.equalが単にFALSEを返すのではなく、違いをreportするためです。

28
Joshua Ulrich

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
13
nullglob

数値許容値の違いとストレージモードの比較に加えて、all.equal()とは異なり、identicalは関連する環境の同等性もテストします。 Rの通常のオブジェクトには、通常、関連付けられた環境はありません。最も一般的には、functionおよびformula(および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:クロージャを比較するときに環境を無視する必要があるかどうかを論理的に示します。

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

11
Ben Bolker