"&安培;"和"&&" R

时间:2017-02-09 12:13:38

标签: r

我在R中有一些非直观的行为。

根据文件

  

&安培;和&&表示逻辑AND和|和||表示逻辑OR。该   较短的形式执行元素比较与大致相同   算术运算符。较长的表单从左到右进行评估   仅检查每个向量的第一个元素。评估进行   直到确定结果。较长的形式是合适的   用于编程控制流程,通常在if子句中使用。

作为R的新手,这还没有触发应该发生的事情的完整心智模型,但它听起来类似于'和' vs && 39;有条件的和'在其他编程语言中看到(也称为Short-Circuiting Logical Operators

创建数据框:

mhbins <- data.frame(val=seq(0,10),bin=rep(c(NA),length.out=11))

   val bin
1    0  NA
2    1  NA
3    2  NA
4    3  NA
5    4  NA
6    5  NA
7    6  NA
8    7  NA
9    8  NA
10   9  NA
11  10  NA

然后修补它:

mhbins$bin[1 <= mhbins$val & mhbins$val <= 7] <- "some"

   val  bin
1    0 <NA>
2    1 some
3    2 some
4    3 some
5    4 some
6    5 some
7    6 some
8    7 some
9    8 <NA>
10   9 <NA>
11  10 <NA>

这是预期的(请注意NA值的打印输出表单会发生变化。评论者Tensibai解释说:&#34; NA是&#34;数字&#34 ; NA,<NA>是字符1,因为矢量(df列是)只能是一种类型,当你输入一个字符值时,它会被强制转换为字符,这就是为什么NA表示更改。&#34;)

但是,另一个谜团。

但是,使用&&,修补程序操作会减少到NA

mhbins <- data.frame(val=seq(0,10),bin=rep(c(NA),length.out=11))

   val bin
1    0  NA
2    1  NA
3    2  NA
4    3  NA
5    4  NA
6    5  NA
7    6  NA
8    7  NA
9    8  NA
10   9  NA
11  10  NA

mhbins$bin[1 <= mhbins$val && mhbins$val <= 7] <- "some"

   val  bin
1    0 <NA>
2    1 <NA>
3    2 <NA>
4    3 <NA>
5    4 <NA>
6    5 <NA>
7    6 <NA>
8    7 <NA>
9    8 <NA>
10   9 <NA>
11  10 <NA>

我不明白这里发生了什么。

1 个答案:

答案 0 :(得分:1)

&#39;&amp;&#39;这里返回一个向量,它是&#39;和&#39;每对1 <= mhbins$valmhbins$val <= 7之间的运算符 虽然&#39;&amp;&amp;&#39;仅查看第一对1 <= mhbins$valmhbins$val <= 7

实施例

c(TRUE,TRUE) & c(FALSE,TRUE) `returns <[1] FALSE  TRUE>`
c(TRUE,TRUE) && c(FALSE,TRUE) `returns <[1] FALSE>`