【问题标题】:Do we talk about reference type and primitive type in R?我们谈论 R 中的引用类型和原始类型吗?
【发布时间】: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


【解决方案1】:

R 中不使用引用或指针。因此,基本类型和引用类型之间的区别是没有意义的,并且已知的陷阱(例如,Java 或 C++ 中比较引用地址而不是其内容)不会发生在R中。

关于在 R 中使用 == 进行比较的警告主要是指在检查浮点值是否相等时可能出现的与有限精度相关的问题,这可能导致 counterintuitive results。与在 R 中使用 == 运算符有关的其他可能错误涉及向量的元素(而不是全局)比较,如 cmets 中所述。

R 中当然有不同的“原始”类型(称为数据类型或“原子”模式),例如数字、逻辑、字符和复数。但是通常甚至不需要指定变量的类型,因为它是通过赋值自动扣除的。

【讨论】:

  • 感谢您的回答!这可能与问题无关,但是按照您在上一段中所说的,我可以问一下,在 R 中,typeclass 之间有什么区别? (因为我们有 typeof() 函数和 class() 函数,并且输出可能不同。)我确实查过了,但没有找到令人满意的足够实用的答案...
  • 不用担心,感谢您的解释 :) 我可能会对此进行更多研究,如果需要,我会在单独的问题中提问
  • @J-A-S 这听起来是个好主意。如果你不介意,我会删除我最后的评论。我觉得不够准确,我什至不确定它是否正确。
  • 当然,但无论如何我认为那是有见地的哈哈。我会@你(可能在这里)让你知道哪一天我有特定的答案
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2018-06-26
  • 2012-02-06
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多