在输入函数中使用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