确定FALSE的来源

时间:2016-01-25 21:30:37

标签: r

我的问题是,是否存在一个函数,给定一个逻辑语句,识别FALSE的来源(如果它是假的)?

例如,

x=1; y=1; z=1;
x==1 & y==1 & z==2

显然,z的值使语句成为假。一般来说,是否有一个函数让我在逻辑语句中识别出哪个值使逻辑语句为假?

2 个答案:

答案 0 :(得分:3)

您可以定义

,而不是撰写x==1 & y==1 & z==2
cn <- c(x == 1, y == 1, z == 2)

cn <- c(x, y, z) == c(1, 1, 2)

并使用all(cn)。然后

which(!cn)
# [1] 3

给出了FALSE的来源。

一般来说,不,没有你正在寻找的这样的功能,但是对于不同的逻辑陈述,类似的方法应该有效,尽管它可能太长而无法追求。

考虑(!(x %in% c(1,2,3)) & y==3) | z %in% c(4,5),如果FALSEz %in% c(4,5)FALSE同时为(!(x %in% c(1,2,3)) & y==3),则会FALSE。因此,如果(!(x %in% c(1,2,3)) & y==3) | z %in% c(4,5)返回FALSE,我们确定z仍然需要检查xy,以便有问题的变量列表可以是获得如下:

if(!((!(x %in% c(1,2,3)) & y==3) | z %in% c(4,5)))
  c("x", "y", "z")[c(x %in% c(1,2,3), !y == 3, TRUE)]
# [1] "x" "y" "z"

a <- !(x %in% c(1,2,3))
b <- y == 3
c <- z %in% c(4,5)
if(!((a & b) | c))
  c("x", "y", "z")[c(!a, !b, TRUE)]
# [1] "x" "y" "z"

答案 1 :(得分:1)

我喜欢@ julius的答案,但也有stopifnot功能。

x <- 1; y <- 1; z <- 2
stopifnot(x == 1, y == 1, z == 1)
#Error: z == 1 is not TRUE

如果有任何虚假陈述,则结果不是错误,如果它们全部为真,则不会产生任何错误。它也会在第一个错误陈述时停止,所以如果你有类似

的东西
x <- T; y <- F; z <- F
stopifnot(x, y, z)
#Error: y is not TRUE

在这种情况下,你不会被告知z是假的。

因此,结果不是逻辑或索引,而是无论是错误还是错误。这似乎并不合适,但如果您使用它的原因是检查函数的输入或类似的地方(想要)在无效输入上产生错误,那么它很有用。如果一切都很好,继续前进。我提到了停止,因为看起来可能是你所处的情况。我不确定。

这是一个可以使用它的愚蠢示例。在这种情况下,您显然只想要正数作为输入并拒绝其他所有内容:

doublePositiveNumber <- function(x){
    stopifnot(is.numeric(x), x >= 0)
    return(2*x)
}

导致

> doublePositiveNumber("hey")
Error: is.numeric(x) is not TRUE
> doublePositiveNumber(-2)
Error: x >= 0 is not TRUE
> doublePositiveNumber(2)
[1] 4

因此,您可以保证获得所需的输入并为用户生成错误消息,并希望告诉他们问题所在。