as.logical双重强制的理由是什么?

npj*_*pjc 10 boolean r r-faq

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

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
Run Code Online (Sandbox Code Playgroud)

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

我确实试图在这里寻找洞察 但没有成功.

我也看了这个相关的问题.

有人可以解释为什么我应该期望上述每个测试值都像他们一样强制执行吗?

Ben*_*ker 13

我的猜测是,这是从C继承的,例如从这里:

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

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

Kernighan和Ritchie的第二版盗版.我在网上找到了(我宁愿没有链接到它).50,第3.2节,"If-Else"(重点补充):

表达式被评估; 如果为true(即,如果expression具有非零值),则执行语句1.如果为false(表达式为零)并且如果存在else部分,则执行语句2.

@hrbrmstr指出用于转换的LOG的R内部定义是在 Rinternals.h:

#define LOGICAL(x) ((int *) DATAPTR(x))
Run Code Online (Sandbox Code Playgroud)

  • @npjc:[因为,数学.](https://en.wikipedia.org/wiki/Boolean_algebra):) (2认同)