在stats::bw.nrd0
的函数源中,有一个复杂的(对我来说)if
语句:
> bw.nrd0
function (x)
{
if (length(x) < 2L)
stop("need at least 2 data points")
hi <- sd(x)
if (!(lo <- min(hi, IQR(x)/1.34)))
(lo <- hi) || (lo <- abs(x[1L])) || (lo <- 1)
0.9 * lo * length(x)^(-0.2)
}
<bytecode: 0x0000000010c688b0>
<environment: namespace:stats>
与常规运算符||
相比,|
是否以特殊方式解释? lo
在何处/如何分配/重新分配?这将如何写成&#34; long form&#34;?
完全披露,我试图将此功能翻译成Python函数in this answer,所以如果你能回答这个问题,你也可以为这个问题添加一个更好的答案。
答案 0 :(得分:3)
感谢一些有用的评论,我现在明白,这意味着如果lo == 0
,我们会分配给hi
,abs(x[1])
或1
中的任何一个非零, 以该顺序。在Python中,我们可以写:
lo = min(hi, iqr/1.34)
lo = lo or hi or abs(x[0]) or 1
或更明确地说:
if not lo:
if hi:
lo = hi
elif abs(x[0]):
lo = abs(x[0])
else:
lo = 1
答案 1 :(得分:1)
来自帮助文档:
&安培;和&amp;&amp;表示逻辑AND和|和||表示逻辑OR。该 较短的形式执行元素比较与大致相同 算术运算符。较长的表单从左到右进行评估 仅检查每个向量的第一个元素。评估进行 直到确定结果。较长的形式是合适的 用于编程控制流程,通常在if子句中使用。