【发布时间】:2021-02-13 15:39:13
【问题描述】:
当我学习java时,我注意到我们避免使用==来比较引用类型,因为==比较引用是否相同,而不是内容。我们只会将== 用于原始类型,因为它们存储在内存中的方式。
我在关系运算符的 R 文档中发现了一个类似的注释:
不要将 == 和 != 用于测试,例如在 if 表达式中,您必须得到一个 TRUE 或 FALSE。除非您绝对确定不会发生任何异常情况,否则您应该使用相同的函数。
紧接着,我发现:
对于数值和复数值,请记住 == 和 != 不允许分数的有限表示,也不允许舍入误差。使用 all.equal 几乎总是更可取的。
我的谦虚问题:
1. 我们谈论 R 中的原始类型吗?如果是这样,它们是什么?我们可以总是安全地使用关系运算符来比较它们吗? (此外,在什么情况下使用关系运算符我们可以“绝对确定不会发生任何异常情况”?)
2. 我看到 R 代码多次使用 == 比较字符串(字符),是我看到的那些 R 代码只是草率还是因为字符/字符串是 R 中的原始类型(或者我们总是可以使用关系运算符来比较的东西)?
[更新]
感谢下面的cmets,我意识到上面的引用主要是试图强调R操作的向量化特征而不是输出的准确性,并且(base)R中关系操作的有效性是极不可能受到与引用类型相关的问题的影响。
欢迎任何进一步解释/澄清的答案或cmets。
【问题讨论】:
-
您引用的“不要使用”段落主要是关于在 R 中,
==运算符是矢量化的,即c(1,2,3) == c(1,2,3)不会返回TRUE,它会返回一个像c(TRUE,TRUE,TRUE)。并且if(c(1,2,3) == c(1,2,3)) {}构造会出于同样的原因发出警告。 -
另外,请查看this 以获取有关 R 的浮点表示的更多说明。
-
@ekoam @Vasily A 非常感谢您指出这些!那么请问我们是否需要担心 R 编程中的“引用类型相对于
==运算符的行为”之类的事情? -
至少在基础 R 中,没有通过引用进行比较这样的东西 (AFAIK)。
x == y在它们相等时为您提供 TRUE,即使它们具有不同的地址。但是,您不应将此运算符视为 Java 的==而不进行参考比较。该运算符与 Java 中的运算符有很大不同。请注意,由于类型强制,R 中的0 == "0"也会为您提供 TRUE。 -
在@VasilyA 的评论中添加一个解决方法可能是使用
all函数,该函数将逻辑向量作为参数并返回TRUE,如果所有元素都是TRUE(基本上是&ing 所有向量元素)也可能很有趣看看any函数,如果任何元素是TRUE则返回TRUE基本上|ing 逻辑向量的元素
标签: r