所以,我发现了这个:
> TRUE == "TRUE"
[1] TRUE
> TRUE == "BOO"
[1] FALSE
> TRUE == "true"
[1] FALSE
> TRUE == "T"
[1] FALSE
> FALSE == "FALSE"
[1] TRUE
> FALSE == "F"
[1] FALSE
根据logical {base}
的R文档:
as.logical试图强迫其论证属于逻辑类型。 字符串c(" T"," TRUE"," True"," true")被认为是真的, c(" F"," FALSE"," False"," false")为false,其他所有为NA。
事实确实如此:
> as.logical("T")
[1] TRUE
显然,TRUE == "T"
发生的事情不是as.logical
种转换。对于这些==比较的行为有没有合理的解释?
答案 0 :(得分:4)
这是我的成就:
从逻辑比较的文档?"=="
:
x和y中的至少一个必须是原子向量,但如果另一个是列表,R会尝试将其强制转换为原子向量的类型:如果列表由长度为1的元素组成,则会成功可以强制转换为正确的类型。 如果两个参数是不同类型的原子向量,则一个被强制为另一个的类型,优先级(递减)的顺序为字符,复数,数字,整数,逻辑和原始。
对我来说,似乎后半部分在这里工作。 TRUE
被"TRUE"
强制执行,实际比较变为"TRUE"=="TRUE"
而不是TRUE==TRUE
。
T
始终转换为TRUE
,因此T=="TRUE"
成立。然而``" T"`在转换发生时没有这样的运气。字符而不是.logical。 。
答案 1 :(得分:1)
就您的问题而言,我无法想象您将评估TRUE == "TRUE"
和"TRUE" == TRUE
的情景。例如;采用包装器函数,我们可以运行变量的所有场景,并通过as.logical, is.logical, x == TRUE, x == FALSE, x != TRUE
等测试迭代它们。
我们的测试函数将执行的操作是获取输入,并仅根据R函数中的逻辑测试返回评估为TRUE
的方案。
f <-function(var){
do_fun <- list(
`%s == TRUE` = function(x)x==TRUE,
`%s == FALSE` = function(x)x == FALSE,
`as.logical(%s)` = function(x)as.logical(x),
`is.logical(%s)` = function(x)is.logical(x))
a <- sapply(names(do_fun), function(i){
do.call(do_fun[[i]],list(var))
})
set_name <- sprintf(names(a),var)
a <- as.list(a)
names(a) <- set_name
a[sapply(a,`[`,1)]
}
在TRUE
# from base test to show
> is.logical(TRUE)
[1] TRUE
现在我们的测试很有趣
> f(TRUE)
$`TRUE == TRUE`
[1] TRUE
$`as.logical(TRUE)`
[1] TRUE
$`is.logical(TRUE)`
[1] TRUE
作为字符串而不是保留字符
> f("true")
$`as.logical("true")`
[1] TRUE
> f("TRUE")
$`"TRUE" == TRUE`
[1] TRUE
$`as.logical("TRUE")`
[1] TRUE
在数值上,输出逻辑基于输入的评估而不是类
> f(10.1)
$`as.logical(10.1)`
[1] TRUE
> f(10.1 > 1)
$`TRUE == TRUE`
[1] TRUE
$`as.logical(TRUE)`
[1] TRUE
$`is.logical(TRUE)`
[1] TRUE
> f(1+1)
$`as.logical(2)`
[1] TRUE
答案 2 :(得分:1)
最好使用isTRUE
> isTRUE
function (x)
identical(TRUE, x)
<bytecode: 0x82228c8>
<environment: namespace:base>
> isTRUE("T")
[1] FALSE
> isTRUE(T)
[1] TRUE
> isTRUE(TRUE)
[1] TRUE
> isTRUE("TRUE")
[1] FALSE
> isTRUE("anything")
[1] FALSE
> isTRUE(1L)
[1] FALSE
> isTRUE(c(TRUE,TRUE))
[1] FALSE
>
> isTRUE(any(c(TRUE,TRUE)))
[1] TRUE
> isTRUE(all(c(TRUE,TRUE)))
[1] TRUE
> answer <- "yes"
> isTRUE(answer %in% c("Y","Yes","y","yes"))
[1] TRUE
> answer <- "no"
> isTRUE(answer %in% c("Y","Yes","y","yes"))
[1] FALSE
> answer <- c("Y","n")
> isTRUE(answer %in% c("Y","Yes","y","yes"))
[1] FALSE