R 逻辑计算不正确?
我想知道为什么我的第一个R 逻辑计算不正确?,r,function,if-statement,R,Function,If Statement,我想知道为什么我的第一个if语句返回Error,而我的输入数据是类numeric的对象 我已经清楚地说明了第一个if语句只有在dataclass是“data.frame”时才打开,但是当data class是numeric时,第一个if语句返回错误!我有什么遗漏吗 更新: 我已将&的实例更改为&,但当数据是data.frame时,函数不会产生任何输出?例如,运行:standard(mtcars) 标准1){ 数据[paste0(名称(数据),“.s”)] 我有什么遗漏吗 &计算这两个元素,而&不
if
语句返回Error
,而我的输入数据是类numeric
的对象
我已经清楚地说明了第一个if
语句只有在dataclass
是“data.frame”
时才打开,但是当data class是numeric
时,第一个if
语句返回错误!我有什么遗漏吗
更新:
我已将&
的实例更改为&
,但当数据是data.frame
时,函数不会产生任何输出?例如,运行:standard(mtcars)
标准1){
数据[paste0(名称(数据),“.s”)]
我有什么遗漏吗
&
计算这两个元素,而&
不计算这两个元素
FALSE&停止(“boh”)
#R> [1]错误
正确和停止(“boh”)
#R> 错误:boh
错误和停止(“boh”)
#R> 错误:boh
请参阅帮助(“逻辑”)
&
和&
表示逻辑and,而
和|
表示逻辑OR。较短的形式执行元素级比较的方式与算术运算符基本相同。较长的形式从左到右求值只检查每个向量的第一个元素。求值继续进行仅在确定结果之前
编辑后 您不会得到任何结果,因为您没有调用
return
或使用if-else
。请参阅help(“函数”)
和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
f1tl;dr在执行流控制时,您应该使用&
而不是&
,因为&
始终计算其第二个参数,而&
如果第一个参数为false,则短路。如果参数不是数据帧(或矩阵),则ncol(x)
没有意义:有关更多信息,请参见例如
继续,用一个简单的例子来解包
x <- 1:5
(但请注意,您必须小心,因为class(x)
可能是包含多个元素的向量:继承(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")
if(逻辑(0))打印(“hello”)时出错:参数的长度为零
如果第一个元素是TRUE
,它就有意义。我想你可能不明白@BenjaminChristofferson和我想说的关于“短路”的内容。问题是ncol(x)
如果x
不是一个数据帧或矩阵,那么对这个参数进行评估(并将其包含在逻辑语句中)是没有意义的造成麻烦[正如您发现的那样]因为它不属于您问题的范围,所以我没有在第一条逻辑语句之外查看函数…也许将一些显式的return()
语句放入其中会有所帮助。最好不要在一篇文章中问多个问题,所以。。。
class(x)=="data.frame" & ncol(x)>1 ## logical(0)
if (logical(0)) print("hello")