as.logical 双重强制的基本原理是啥?

Posted

技术标签:

【中文标题】as.logical 双重强制的基本原理是啥?【英文标题】:What is the rationale for as.logical double coercion?as.logical 双重强制的基本原理是什么? 【发布时间】:2015-12-17 13:55:29 【问题描述】:

我试图理解双打的强制原理:

as.logical(c(-1, -0.01, 0, 0.01, 0.1,1:10))
#>  [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [12]  TRUE  TRUE  TRUE  TRUE

我可以看到强制发生在标量上(符号无关紧要)并且 只有 0 被强制转换为 FALSE。对此我感到很惊讶, 似乎没有“最接近...”或四舍五入到 0L 或 1L 的概念。 我很好奇为什么。

我确实尝试过四处寻找洞察力 here 但没有成功。

我也看了this related question。

有人能解释一下为什么我应该期待上述每个测试值吗 像他们那样胁迫?

【问题讨论】:

【参考方案1】:

我的猜测是这是从 C 继承的,例如来自here:

在 C 中,true 由任何不等于 0 的数值表示,false 由 0 表示

另见例如here;目前我找不到更好的官方语言规范来源。

Kernighan 和 Ritchie 2d ed 的盗版副本。我在网上找到(我宁愿不链接到它)在 p 上说。 50,第 3.2 节,“If-Else”(已添加重点):

表达式被计算;如果为真(即如果表达式具有非零值),则执行语句 1。如果它为假(表达式为零)并且如果有 else 部分,则执行语句 2。

@hrbrmstr 指出用于转换的 LOGICAL 的 R 内部定义位于 Rinternals.h:

#define LOGICAL(x) ((int *) DATAPTR(x))

【讨论】:

我想问题就变成了为什么这是C中定义的基本原理!

以上是关于as.logical 双重强制的基本原理是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Windows平台下的RcppArmadillo“inDL(x,as.logical(local),as.logical(now),...)中的错误”[关闭]

OSPF到底是啥?一文了解OSPF基本概念和工作原理

所有不同的 X509KeyStorageFlags 的基本原理是啥?

C++ switch 仅适用于整数类型的基本原理是啥? [复制]

Apple 检查返回值而不是错误的模式背后的基本原理是啥?

IEEE754 中 inf==inf 的基本原理是啥