isTRUE(all.equal(x, y))
とidentical(x, y)
のテストに違いはありますか?
ヘルプページには次のように書かれています。
'if'式で 'all.equal'を直接使用しないでください—必要に応じて 'isTRUE(all.equal(....))'または 'identical'を使用してください。
しかし、その「適切な場合」は私に疑問を残します。 2つのうちどちらが適切かをどのように判断しますか?
all.equal
はほぼ等しいかどうかをテストしますが、identical
はより正確です(たとえば、違いに対する許容度がなく、ストレージタイプを比較します)。同一から:
関数「all.equal」は、この方法で等式をテストするために使用されることもありますが、別の目的で使用されていました。数値結果にわずかな違いが生じる可能性があります。
また、all.equal
をisTRUE
でラップする理由の1つは、all.equal
が単にFALSE
を返すのではなく、違いをreportするためです。
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
数値許容値の違いとストレージモードの比較に加えて、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:クロージャを比較するときに環境を無視する必要があるかどうかを論理的に示します。
ただし、クロージャ(つまり関数)を比較するときにのみ適用されるため、この場合は違いはありません。また、数式や用語オブジェクトを比較するときにも違いはありません。