如何解释double"或" ||和if子句中的赋值

时间:2016-07-13 13:03:19

标签: r operators variable-assignment

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,所以如果你能回答这个问题,你也可以为这个问题添加一个更好的答案。

2 个答案:

答案 0 :(得分:3)

感谢一些有用的评论,我现在明白,这意味着如果lo == 0,我们会分配给hiabs(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子句中使用。