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