逻辑未正确评估?

时间:2018-03-17 19:15:48

标签: r function if-statement

我想知道为什么当我的输入数据是类if的对象时,我的第一个Error语句会返回numeric

我已明确声明第一个if语句仅在数据class"data.frame"时启用,但在数据类为numeric时,此第一个{{ 1}}语句返回错误!我在这里错过了什么吗?

更新

我已将if的实例更改为&,但当数据为&&时,该函数不会产生任何输出?例如,运行:data.frame

standard(mtcars)

2 个答案:

答案 0 :(得分:2)

  我在这里错过了什么吗?

&&&

时评估这两个元素
FALSE && stop("boh")
#R> [1] FALSE
TRUE  && stop("boh")
#R> Error: boh
FALSE &  stop("boh")
#R> Error: boh

请参阅help("Logic")

  

&&&表示逻辑AND,|||表示逻辑OR。较短的形式以与算术运算符大致相同的方式执行元素比较。 较长的表单从左到右评估仅检查每个向量的第一个元素。 评估仅在确定结果之前进行。

编辑后

由于您未致电return或使用if else,因此未获得任何结果。请参阅help("function")help("if")。这是一个小例子

f1 <- function(x){
  if(x < 0){
    x <- -1
    x
  }

  if(x > 0){
    x <- 1
    x
  }
}
f1(-1)

f2 <- function(x){
  if(x < 0){
    x <- -1
    x
  }
  else if(x > 0){
    x <- 1
    x
  }
}
f2(-1)
#R> [1] -1

f3 <- function(x){
  if(x < 0){
    x <- -1
    return(x)
  }

  if(x > 0){
    x <- 1
    return(x)
  }
}
f3(-1)
#R> [1] -1

答案 1 :(得分:2)

tl; dr 在执行流量控制时,您应该使用&&而不是&,因为&始终会评估其第二个参数,而{{1}如果第一个参数为假,则短路。如果参数不是数据框(或矩阵),则&&没有意义:参见例如this question了解更多信息。

继续并用一个简单的例子解压缩它。

ncol(x)

第一部分很好:

x <- 1:5

(虽然请注意,您必须小心,因为class(x) ## "integer" class(x)=="data.frame" ## TRUE 可能是包含多个元素的向量:class(x)更安全。

第二部分导致问题:

inherits(x,"data.frame")

把它们放在一起:

ncol(x) ## NULL (uh-oh)
ncol(x)>1  ## numeric(0) (uh-oh)

这是做什么的?

class(x)=="data.frame" & ncol(x)>1  ## logical(0)
  

if(logical(0))print(“hello”):参数长度为零

时出错