当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。