首页 文章

具有关系运算符的字符行为

提问于
浏览
1

有人可以解释为什么R会这样做吗?它背后的原因呢?

"-1" < 0
#[1] TRUE
# expected [1] FALSE # OR better NA

"-abc" < 0
#[1] TRUE
# expected [1] FALSE # OR better NA

来自 ?Comparison

如果两个参数是不同类型的原子向量,则一个被强制为另一个的类型,优先级的(递减)顺序为字符,复数,数字,整数,逻辑和原始

这对FWIW都没有帮助:

toString(-1) < 0
as.character(-1) < 0
toString("-abc") < 0
as.character("-abc") < 0

期待不同的结果我错了吗?我问这个,因为在我看来,如果不知道的话,这会在函数内部产生意想不到的结果 .

1 回答

  • 3

    引用您已经引用的优先规则:

    优先顺序(递减)为字符,复数,数字,整数,逻辑和原始

    所以在表达式中:

    "-abc" < 0
    

    正在发生的事情是,RHS上的 0 正被强迫进入角色 . 这让我们:

    "-abc" < "0"
    

    这在词典上是真实的(你可以自己检查) . 因此表达式的计算结果为true . 请注意,如果强制转向另一种方式,即如果R试图强制 "-abc" 为数字类型,那么它将导致 NA ,并且整个表达式将评估为 NA ,而不是真的:

    "-abc" < 0
    NA < 0
    NA
    

    所以,这就是我们如何知道R正在强迫RHS加入角色 .

    R(或SQL,Java,JavaScript,实际上是任何语言)的一个好的经验法则是不要乱用类型 . 如果您知道您的数据是数字,那么使用数字类型并将其视为这样,反之亦然 .

相关问题