繁体   English   中英

R中的简单if-else循环

[英]Simple if-else loop in R

有人能告诉我这个在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

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

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

正如@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM