Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在输入函数中使用is.na时,Reduce函数返回错误的逻辑输出_R - Fatal编程技术网

在输入函数中使用is.na时,Reduce函数返回错误的逻辑输出

在输入函数中使用is.na时,Reduce函数返回错误的逻辑输出,r,R,比较以下评估的结果: Reduce(function (x, y) is.na(x) | is.na(y), list(c(1, 2, NA), 1:3, 1:3)) ## [1] FALSE FALSE FALSE & 他们在逻辑上进行相同的计算,但结果不同。第二个结果是我所期望的。为什么它的行为与第一个示例所示的一样 顺便说一下,当列表仅包含两个逻辑向量时: Reduce(function (x, y) is.na(x) | is.na(y), list(c(1, 2, NA), 1:3

比较以下评估的结果:

Reduce(function (x, y) is.na(x) | is.na(y), list(c(1, 2, NA), 1:3, 1:3))
## [1] FALSE FALSE FALSE
&

他们在逻辑上进行相同的计算,但结果不同。第二个结果是我所期望的。为什么它的行为与第一个示例所示的一样


顺便说一下,当列表仅包含两个逻辑向量时:

Reduce(function (x, y) is.na(x) | is.na(y), list(c(1, 2, NA), 1:3))
## [1] FALSE FALSE  TRUE

Reduce
再次按预期运行。

让我们使用
accumulate=TRUE查看它:

Reduce(函数(x,y)是.na(x)|是.na(y),列表(c(1,2,na),1:3,1:3),累加=T)
# [[1]]
#[1]12 NA
# [[2]]
#[1]假假假真
# [[3]]
#[1]错
我们从第一个向量开始,
c(1,2,NA)

  • 在函数的第一次迭代中,
    x
    c(1,2,NA)
    y
    1:3
    。返回值为
    c(F,F,TRUE)

  • 在函数的第二次迭代中,
    x
    是上一步的返回值,因此
    c(F,F,TRUE)
    ;而
    y
    是下一个向量,
    1:3
    。请注意,
    x
    中没有一个是
    NA
    ,因此
    is.NA(x)
    is.NA(y)
    一样都是假的。因此,此步骤的输出是
    c(F,F,F)

  • 在第三次迭代中,与第二次迭代类似,
    x
    是前一步的输出(
    c(F,F,F)
    )。没有什么是
    NA

  • 我想你需要的是

    Reduce(函数(x,y)x是.na(y),list(c(1,2,na),1:3,1:3),init=c(FALSE,FALSE,FALSE))
    #[1]假假假真
    
    有关这方面的注意事项:

      首先要考虑函数的迭代在第一个参数<代码> x之间的“传递”。在您的例子中,您需要它是逻辑的,但实际上您传递了一个混合(第一次是数字的,第二次是逻辑的,以及随后的)。将迭代之间传递的内容视为“系统状态”

    • 逻辑的“标识”(起点)都是false,或者
      init=c(false,false,false)

    • 从这里开始,请注意第一个参数应该始终是逻辑的,而不是
      NA
      ,因此我们将条件的第一部分从
      is.NA(x)
      更改为
      x
      。如果你对这些数据有点偏执,你可以一直这样做

      Reduce(函数(x,y)(is.na(x)| x)| is.na(y),list(c(1,2,na),1:3,1:3),
      init=c(假,假,假))
      
      我们将原来的
      is.na(x)
      替换为
      (is.na(x)| x)
      。(分组参数不是必需的,只是为了在此处可视化而添加。)


    啊哈,是的,我知道我愚蠢的错误来自哪里。我的思想扭曲了。非常感谢。与您的建议相比,
    Reduce(|),lappy(list(c(1,2,NA),1:3,1:3),is.NA))
    更简单。你能建议我在以后的练习中改用你的吗?不,事实上这更容易理解。很高兴你知道了错误的要点:-)
    Reduce(function (x, y) is.na(x) | is.na(y), list(c(1, 2, NA), 1:3))
    ## [1] FALSE FALSE  TRUE