R语言赋值语句何时返回FALSE?bw.nrd0函数特殊语法疑问
R语言bw.nrd0函数特殊语法疑问解答
首先澄清最核心的误解:R语言中赋值表达式<-的返回值是被赋予的变量值本身,不存在“赋值成功返回TRUE、失败返回FALSE”的逻辑。你看到的||分支走查,是R的逻辑短路求值规则,以及数值在逻辑上下文的自动类型转换共同作用的结果。
赋值表达式被判定为FALSE的场景
R会在逻辑判断的上下文中,自动将非逻辑类型的值强制转换为逻辑值,以下赋值场景会让整个赋值表达式被判定为FALSE:
- 被赋的值为逻辑值
FALSE - 被赋的值为数值0、整数0、复数0
- 被赋的值为空字符串
""
你提到的lo <- hi返回FALSE的情况,本质就是hi的值为0,赋值表达式返回0,被自动转换成了逻辑值FALSE,和赋值操作本身是否成功无关。
对应示例代码的逻辑梳理
你给出的代码里存在一处笔误:IQR(x1)实际应为IQR(x),完整逻辑是为了处理所有样本值完全相等的极端边界场景:
bw.nrd0_test <- function (x) { if(length(x) < 2L) stop("need at least 2 data points") hi <- sd(x) # 当所有样本值完全相等时,sd(x)=0,IQR(x)=0,min返回0,!0为TRUE,进入后续分支 if(!(lo <- min(hi, IQR(x)/1.34)))# qnorm(.75) - qnorm(.25) = 1.34898 # 逻辑或短路求值:从左到右找第一个被判定为TRUE的赋值结果 # 第一步:hi此时为0,赋值后返回0,判定为假,继续下一个 # 第二步:如果样本全为0,abs(x[1L])也为0,判定为假,继续下一个 # 第三步:兜底赋值为1,一定为真,终止求值 (lo <- hi) || (lo <- abs(x[1L])) || (lo <- 1.) 0.9 * lo * length(x)^(-0.2) }
你尝试触发异常得到直接中断的结果也符合预期:只有赋值操作合法完成、返回了上述假值时才会走逻辑分支,如果赋值过程本身出现运行时错误(比如引用不存在的变量、类型不兼容),会直接抛出错误终止执行,不会进入逻辑判断流程。
内容的提问来源于stack exchange,提问作者spec3
相关产品推荐
相关产品推荐

