gpt4 book ai didi

r - 与 `all` 或空对象相比,如何避免 `TRUE` 函数返回 `NULL`

转载 作者:行者123 更新时间:2023-12-04 09:15:53 26 4
gpt4 key购买 nike

我经常用 all功能,每当我收到 TRUE ,我发现自己检查了比较的元素都不是 NULL或为空,因为这可能会产生错误 TRUE结果。

例子:

y<-1:10
z<-5:15

# I make a comparison which is really true
all(y[y>5 & y<10]==z[z>5 & z<10])
[1] TRUE

# Now I make a typo because I often do, but I don't notice:
all(y[y>5 & y<0]==z[z>5 & z<10])
[1] TRUE
# the result is also true but only because y[y>5 & y<0] is empty:
y[y>5 & y<0]
#integer(0)

所以,在第二种情况下,如果我不检查 all 的每个元素,我会用我的代码去一个,认为一切都很顺利,当然,最后的结果会不正确。

而不是检查我放在 all 中的元素打电话,我可以加一个 length电话: (all(y[y>5 & y<0]==z[z>5 & z<10]) & length(y[y>5 & y<0])>0 & length(z[z>5 & z<10]>0)但这似乎相当乏味......

有没有办法让 all返回 NAFALSE当任一元素的长度为 0 时( all help 对该主题不是很有帮助)还是有替代函数可以做到这一点?

编辑

感谢@Metrics,有一个函数 identical 的替代方案:
identical(y[y>5 & y<0],z[z>5 & z<10])
[1] FALSE

虽然 identical不返回 TRUE在这种情况下,它仍然没有警告我出现了问题......

理想的解决方案是返回一个警告,例如,一个元素是空的。

最佳答案

all 的文档明确地说:

That all(logical(0)) is true is a useful convention: it ensures that

all(all(x), all(y)) == all(x, y) even if x has length zero.



所以无法通过 all 获得您想要的结果.

如评论中所述, identicalall.equal更接近您的要求。然而, identical如果比较对象的长度不同,则不会警告您。 all.equal的缺点是在不同长度的情况下它不会返回一个逻辑值:
all.equal(y[y>5 & y<0],z[z>5 & z<10])
# [1] "Numeric: lengths (0, 4) differ"

并且我相信官方文档建议不要使用 all.equal直接在 if表达式:

Do not use all.equal directly in if expressions—either use isTRUE(all.equal(....)) or identical if appropriate.



然而, isTRUE(all.equal(y[y>5 & y<0],z[z>5 & z<10]))不会告诉你不同的长度。

【解决方案】

您可以简单地为此目的编写自己的函数,并为方便起见添加一些语法糖:
'%=%' <- function(a,b) {
if (length(a)!=length(b)) warning('Objects are of different length')
identical(a,b)
}

它将返回 TRUE如果对象相同
y[y>5 & y<10]  %=%  z[z>5 & z<10]
# [1] TRUE

FALSE如果对象不同(+警告如果它们的长度不同):
y[y>5 & y<0]  %=%  z[z>5 & z<10]
# [1] FALSE
# Warning message:
# In y[y > 5 & y < 0] %=% z[z > 5 & z < 10] :
# Objects are of different length

关于r - 与 `all` 或空对象相比,如何避免 `TRUE` 函数返回 `NULL`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28502037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com