【问题标题】:How does the condition in if statements get coerced to logical?if 语句中的条件如何被强制为逻辑?
【发布时间】:2019-03-11 21:03:49
【问题描述】:

if 的文档说条件应该是(强调我的):

非 NA 的长度为 1 的逻辑向量。长度条件 当前接受大于 1 并发出警告,但只有 使用第一个元素。相反,当 环境变量 _R_CHECK_LENGTH_1_CONDITION_ 设置为 true。 如果可能,其他类型被强制为逻辑,忽略任何类。

强制是如何完成的,“忽略任何类”是什么意思?

例如,表达式list(1) 可以通过as.logical 显式强制转换为TRUE,并通过相等比较隐式视为TRUE

> as.logical(list(1))
[1] TRUE
> list(1) == TRUE
[1] TRUE

那么,为什么下面会失败呢?

> if (list(1)) print("Passed test!")
Error in if (list(1)) print("Passed test!") : 
  argument is not interpretable as logical

【问题讨论】:

  • 也许在这种情况下类型仅指原子类型。如果你这样做if (list(1)[[1]]) ... ,那么它可以工作
  • 因素也有一些奇怪的行为,比较if ("FALSE")if(factor("FALSE", levels = "FALSE"))

标签: r


【解决方案1】:

发生这种情况是因为 R 中的 if 使用主要对象类,在您的示例中,主要对象是列表而不是它们的内容,当您使用 as.logical 时,内部值将转换为逻辑返回一个数组。

a = list(x = 1, y = 0)
as.logical(a) # TRUE FALSE

只有当主对象值是数字或某些特殊字符串时才能默认转换为逻辑。

if("true") "ok" # ok
if(-1) "ok" # ok

val = 1
class(val) = "test"
attr(a, "something") = 0

if(val) "ok" # ok

[EDIT_1]

要解释的另一件好事是关于因子:因子不是作为字符数组,而是作为数字数组。这些数字指的是值“标志”。

val = factor("TRUE", "FALSE")
as.numeric(val) # 1 (for TRUE), 2 (for FALSE)

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 2021-12-08
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多