gpt4 book ai didi

r - 为什么空逻辑向量通过 stopifnot() 检查?

转载 作者:行者123 更新时间:2023-12-03 07:38:01 25 4
gpt4 key购买 nike

今天发现我的一些stopifnot()测试失败,因为传递的参数评估为空的逻辑向量。

下面是一个例子:

stopifnot(iris$nosuchcolumn == 2)  # passes without error

这是非常不直观的,似乎与其他一些行为相矛盾。考虑:
isTRUE(logical())
> FALSE

stopifnot(logical())
# passes

所以 stopifnot()即使此参数不是 TRUE 也会通过.
但此外,上述行为对于不同类型的空向量是不同的。
isTRUE(numeric())
> FALSE

stopifnot(numeric())
# Error: numeric() are not all TRUE

以上是否有一些逻辑,还是应该将其视为错误?

最佳答案

akrun 和 r2evans 的评论是正确的。

但是,要详细说明为什么会发生这种情况以及为什么您对 isTRUE() 感到困惑。行为,请注意 stopifnot()检查三件事;检查是(其中 r 是您传递的表达式的结果):

if (!(is.logical(r) && !anyNA(r) && all(r)))

那么,让我们来看看:
is.logical(logical())
# [1] TRUE
!anyNA(logical())
# [1] TRUE
all(logical())
# [1] TRUE

is.logical(numeric())
# [1] FALSE
!anyNA(numeric())
# [1] TRUE
all(numeric())
# [1] TRUE

所以,唯一的原因 logical()通过同时 numeric()失败是因为 numeric()正如 akrun 所建议的那样,这不是“合乎逻辑的”。出于这个原因,您应该避免可能导致长度为 0 的逻辑向量的检查,如 r2evans 所建议的。

关于r - 为什么空逻辑向量通过 stopifnot() 检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61859980/

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