【问题标题】:What is going on with R coercing "TRUE" string to TRUE logical?R将“TRUE”字符串强制为TRUE逻辑发生了什么?
【发布时间】:2016-12-04 07:37:51
【问题描述】:

所以,我发现了这个:

> 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 类型的转换。这些 == 比较的行为有什么合理的解释吗?

【问题讨论】:

  • TRUE == T #[1] TRUE "T" 可以是任何东西。顺便说一句,最好用 TRUE 而不是缩写的 T,因为它会导致一些问题
  • 在这里发表评论,所以它也发给@akrun ..他可能能够提供更好的帮助。这是我绑定的东西,但无法解释输出:trace ("=="); "TRUE"==T > 虽然我对文档的解释似乎是正确的,但进一步的了解会有所帮助。
  • 可能跑题了,但有函数isTRUE 可用于答案必须为 TRUE 且仅当它与 TRUE 相同的情况下,否则会导致 FALSE(甚至TRUE) 的向量。

标签: r string boolean coercion


【解决方案1】:

这就是我所做的: 来自逻辑比较的文档?"=="

x 和 y 中至少一个必须是原子向量,但如果另一个是列表,R 会尝试将其强制转换为原子向量的类型:如果列表由长度为 1 的元素组成,这将成功可以强制转换为正确的类型。 如果两个参数是不同类型的原子向量,则将一个强制转换为另一个的类型,优先级(递减)顺序为字符、复数、数字、整数、逻辑和原始。

在我看来,后半部分似乎在这里起作用。 TRUE 被强制转换为 "TRUE",实际比较变为 "TRUE"=="TRUE" 而不是 TRUE==TRUE

T 总是被转换为TRUE 所以T=="TRUE" 成立。然而,当转换发生在.character而不是.logical时,“T”就没有这样的运气了。 .

【讨论】:

  • 当然,就是这样!是否有任何其他语言可以将布尔值强制转换为字符串然后进行比较?天哪,恐怖。
  • 是的,你每天都会在后院发现 R 僵尸 :-) 顺便说一句,我要补充一点,我的解释的准确性取决于那句话中 decreasing order 的含义。应该有人能够跟踪转换是如何实际发生的。如何做到这一点?
  • 根本没有僵尸,你得拿苹果和苹果比较,就是这样。
【解决方案2】:

就您的问题而言,我无法想象您将评估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

【讨论】:

  • 很酷的例子,谢谢!我也很难想象它的实际用途,但我正在教一个统计类,其中一个学生实际上在他的代码中使用“TRUE”而不是 TRUE,当它起作用时我惊呆了。
  • 是的,除了可能是指导性的哈哈之外,这没有任何用处。还写了半睡半醒...但是对名称的评估可能会以某种方式有用...只是没有考虑过
【解决方案3】:

最好使用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

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2017-12-07
    • 2012-04-12
    • 1970-01-01
    • 2014-05-16
    相关资源
    最近更新 更多