我的问题是,是否存在一个函数,给定一个逻辑语句,识别FALSE的来源(如果它是假的)?
例如,
x=1; y=1; z=1;
x==1 & y==1 & z==2
显然,z
的值使语句成为假。一般来说,是否有一个函数让我在逻辑语句中识别出哪个值使逻辑语句为假?
答案 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)
,如果FALSE
为z %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
仍然需要检查x
和y
,以便有问题的变量列表可以是获得如下:
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
因此,您可以保证获得所需的输入并为用户生成错误消息,并希望告诉他们问题所在。