當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R identical 測試對象是否完全相等


R語言 identical 位於 base 包(package)。

說明

測試兩個對象是否完全相同的安全可靠的方法。在這種情況下,它返回TRUE,在其他情況下返回FALSE

用法

identical(x, y, num.eq = TRUE, single.NA = TRUE, attrib.as.set = TRUE,
          ignore.bytecode = TRUE, ignore.environment = FALSE,
          ignore.srcref = TRUE, extptr.as.ref = FALSE)

參數

x, y

任何R對象。

num.eq

邏輯指示是否應使用 == (‘equal’) 或按位比較來比較( doublecomplexNA )數字。後者(非默認)區分 -0+0

single.NA

邏輯指示概念上是否隻有一個數字 NA 和一個 NaNsingle.NA = FALSE 區分位模式。

attrib.as.set

邏輯指示 xy 中的 attributes 是否應被視為無序標記對列表 (“sets”);目前這也適用於 S4 對象的slot。設置 attrib.as.set = FALSE 可能太嚴格。

ignore.bytecode

邏輯指示在比較 closure 時是否應忽略字節代碼。

ignore.environment

邏輯指示在比較 closure 時是否應忽略它們的環境。

ignore.srcref

邏輯指示在比較 closure 時是否應忽略它們的 "srcref" 屬性。

extptr.as.ref

邏輯指示外部指針對象是否應與引用對象進行比較,並且僅當它們是內存中的同一對象時才被視為相同。默認情況下,如果外部指針包含的地址相同,則認為它們是相同的。

細節

identical 的調用是測試 ifwhile 語句以及使用 &&|| 的邏輯表達式中完全相等的方法。在所有這些應用程序中,您需要確保獲得單個邏輯值。

用戶經常使用比較運算符,例如==或者!=,在這些情況下。這看起來很自然,但這並不是這些運算符的設計目的R。它們返回一個像參數一樣的對象。如果你期望xy長度為 1,但碰巧其中一個不是,你會不是得到一個FALSE。同樣,如果參數之一是NA,結果也是NA。無論哪種情況,表達式if(x == y)....不會按預期工作。

函數 all.equal 有時也用於以這種方式測試相等性,但其目的不同:它允許數值結果存在微小差異。

identical 中的計算也很可靠並且通常很快。永遠不應該有錯誤。殺死 identical 的唯一已知方法是在 C 級別使用無效指針,從而生成內存錯誤。它通常會很快發現不平等。如果兩個大型複雜對象相同或幾乎相同,但代表完全獨立的副本,則檢查兩個大型複雜對象的相等性可能需要更長的時間。然而,對於大多數應用程序,計算成本應該可以忽略不計。

如果 single.NA 為 true,默認情況下,identical 會將 NaN 視為與 NA_real_ 不同,但所有 NaN 都是相等的(並且所有相同類型的 NA 都是相等的)。

字符串(標記編碼 "bytes" 中的字符串除外)即使采用不同的標記編碼也被視為相同,但在轉換為 UTF-8 時會一致。標記編碼"bytes"的字符串僅被視為與相同編碼、相同內容的字符串相同。

如果 attrib.as.set 為 true,則默認情況下,屬性比較將它們視為一個集合(而不是向量,因此不測試順序)。

如果 ignore.bytecode 為 true(默認值),則在比較中將忽略函數的已編譯字節碼(請參閱 cmpfun )。如果為 false,則僅當函數是同一編譯對象的副本(或兩者都未編譯)時,它們才會比較相等。要檢查兩個不同的編譯是否相等,您應該比較 disassemble() 的結果。

您幾乎不想在 "POSIXlt" 類的日期時間上使用 identical :不僅不同時區的不同時間可以表示相同的時間,並且時區有多個名稱,而且其中幾個組件是可選的。

請注意,最嚴格的平等測試是

    identical(x, y,
              num.eq = FALSE, single.NA = FALSE, attrib.as.set = FALSE,
              ignore.bytecode = FALSE, ignore.environment = FALSE,
              ignore.srcref = FALSE, extptr.as.ref = TRUE)

單個邏輯值 TRUEFALSE ,絕不是 NA ,並且絕非單個值以外的任何值。

例子

identical(1, NULL) ## FALSE -- don't try this with ==
identical(1, 1.)   ## TRUE in R (both are stored as doubles)
identical(1, as.integer(1)) ## FALSE, stored as different types

x <- 1.0; y <- 0.99999999999
## how to test for object equality allowing for numeric fuzz :
(E <- all.equal(x, y))
identical(TRUE, E)
isTRUE(E) # alternative test
## If all.equal thinks the objects are different, it returns a
## character string, and the above expression evaluates to FALSE

## even for unusual R objects :
identical(.GlobalEnv, environment())

### ------- Pickyness Flags : -----------------------------

## the infamous example:
identical(0., -0.) # TRUE, i.e. not differentiated
identical(0., -0., num.eq = FALSE)
## similar:
identical(NaN, -NaN) # TRUE
identical(NaN, -NaN, single.NA = FALSE) # differ on bit-level

### For functions ("closure"s): ----------------------------------------------
###     ~~~~~~~~~
f <- function(x) x
f
g <- compiler::cmpfun(f)
g
identical(f, g)                        # TRUE, as bytecode is ignored by default
identical(f, g, ignore.bytecode=FALSE) # FALSE: bytecode differs

## GLM families contain several functions, some of which share an environment:
p1 <- poisson() ; p2 <- poisson()
identical(p1, p2)                          # FALSE
identical(p1, p2, ignore.environment=TRUE) # TRUE

## in interactive use, the 'keep.source' option is typically true:
op <- options(keep.source = TRUE) # and so, these have differing "srcref" :
f1 <- function() {}
f2 <- function() {}
identical(f1,f2)# ignore.srcref= TRUE : TRUE
identical(f1,f2,  ignore.srcref=FALSE)# FALSE
options(op) # revert to previous state


作者

John Chambers and R Core

參考

Chambers, J. M. (1998) Programming with Data. A Guide to the S Language. Springer.

也可以看看

all.equal 用於說明兩個對象有何不同; ComparisonLogic 用於按元素比較。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Test Objects for Exact Equality。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。