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 |
邏輯指示是否應使用 |
single.NA |
|
attrib.as.set |
邏輯指示 |
ignore.bytecode |
邏輯指示在比較 closure 時是否應忽略字節代碼。 |
ignore.environment |
邏輯指示在比較 closure 時是否應忽略它們的環境。 |
ignore.srcref |
邏輯指示在比較 closure 時是否應忽略它們的 |
extptr.as.ref |
邏輯指示外部指針對象是否應與引用對象進行比較,並且僅當它們是內存中的同一對象時才被視為相同。默認情況下,如果外部指針包含的地址相同,則認為它們是相同的。 |
細節
對 identical
的調用是測試 if
和 while
語句以及使用 &&
或 ||
的邏輯表達式中完全相等的方法。在所有這些應用程序中,您需要確保獲得單個邏輯值。
用戶經常使用比較運算符,例如==
或者!=
,在這些情況下。這看起來很自然,但這並不是這些運算符的設計目的R。它們返回一個像參數一樣的對象。如果你期望x
和y
長度為 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)
值
單個邏輯值 TRUE
或 FALSE
,絕不是 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
用於說明兩個對象有何不同; Comparison
和 Logic
用於按元素比較。
相關用法
- R identity 恒等函數
- R invisible 將打印模式更改為不可見
- R icuSetCollate 按 ICU 設置整理
- R is.recursive 對象是原子的還是遞歸的?
- R is.object 對象是“內部分類的”嗎?
- R integer 整數向量
- R isS4 測試 S4 對象
- R iconv 在編碼之間轉換字符向量
- R interactive R 是否以交互方式運行?
- R is.language 對象是語言對象嗎?
- R interaction 計算因子交互作用
- R isSymmetric 測試矩陣或其他對象是否對稱(厄米特)
- R is.finite 有限、無限和 NaN 數
- R is.single 對象是單精度類型嗎?
- R is.R 我們使用的是 R,而不是 S?
- R is.unsorted 測試對象是否未排序
- R ifelse 條件元素選擇
- R is.function 是類型(原始)函數的對象嗎?
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Test Objects for Exact Equality。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。