R强迫" TRUE"是怎么回事?字符串为TRUE逻辑?

时间:2016-12-04 07:37:52

标签: r string boolean coercion

所以,我发现了这个:

> 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种转换。对于这些==比较的行为有没有合理的解释?

3 个答案:

答案 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