我想知道为什么当我的输入数据是类if
的对象时,我的第一个Error
语句会返回numeric
?
我已明确声明第一个if
语句仅在数据class
为"data.frame"
时启用,但在数据类为numeric
时,此第一个{{ 1}}语句返回错误!我在这里错过了什么吗?
更新
我已将if
的实例更改为&
,但当数据为&&
时,该函数不会产生任何输出?例如,运行:data.frame
standard(mtcars)
答案 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”):参数长度为零
时出错