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),...)中的错误”[关闭]
所有不同的 X509KeyStorageFlags 的基本原理是啥?