【问题标题】:Simple if-else loop in RR中的简单if-else循环
【发布时间】:2012-01-18 03:07:30
【问题描述】:

有人能告诉我 R 中的 if-else 循环有什么问题吗?我经常无法让 if-else 循环工作。我收到一个错误:

if(match('SubjResponse',names(data))==NA) {
    observed <- data$SubjResponse1
}
else {
    observed <- data$SubjResponse
}

注意data 是一个数据框。

错误是

Error in if (match("SubjResponse", names(data)) == NA) { : 
  missing value where TRUE/FALSE needed

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    这不是一个完整的例子,因为我们没有数据,但我看到了这些问题:

    1. 不能==测试NA,你需要is.na()
    2. 同样,match() 和朋友的输出通常会测试 NULL 或 length()==0
    3. 我倾向于在一行上写} else {

    【讨论】:

    【解决方案2】:

    正如@DirkEddelbuettel 所说,您不能以这种方式测试NA。但是你可以让match 不返回NA

    通过使用nomatch=0 并反转if 子句(因为0 被视为FALSE),可以简化代码。此外,另一个有用的编码习惯是分配 if 子句的结果,这样您就不会在其中一个分支中输入错误的变量名...

    所以我会这样写:

    observed <- if(match('SubjResponse',names(data), nomatch=0)) {
        data$SubjResponse # match found
    } else {
        data$SubjResponse1 # no match found
    }
    

    顺便说一句,如果你“经常”遇到 if-else 问题,你应该注意两件事:

    1. 要测试的对象不能包含 NA 或 NaN,或者是字符串(模式字符)或不能强制转换为逻辑值的其他类型。数字没问题:0 是 FALSE 其他任何值(但 NA/NaN)是 TRUE

    2. 对象的长度应该正好是 1(一个标量值)。它可以更长,但随后您会收到警告。如果它更短,则会出现错误。

    例子:

    len3 <- 1:3
    if(len3) 'foo'  # WARNING: the condition has length > 1 and only the first element will be used
    
    len0 <- numeric(0)
    if(len0) 'foo'  # ERROR: argument is of length zero
    
    badVec1 <- NA
    if(badVec1) 'foo' # ERROR: missing value where TRUE/FALSE needed
    
    badVec2 <- 'Hello'
    if(badVec2) 'foo' # ERROR: argument is not interpretable as logical
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多