【问题标题】:How to interpret double "or" || and assignment in if clause如何解释双“或” || if 子句中的赋值
【发布时间】:2016-11-16 02:15:25
【问题描述】:

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 在哪里/如何被分配/重新分配?这将如何写成“长格式”?

完全披露,我尝试将这个函数翻译成 Python 函数in this answer,所以如果你能回答这个问题,你也可以为这个问题添加一个更好的答案。

【问题讨论】:

  • 当在赋值中使用逻辑或时,它通常表示“如果第一个 this 是真的,将它分配给变量,否则分配第二个东西。所以它可能意味着”如果 hi 是真的,分配它,否则分配 abs(x[1L])"。免责声明:我不知道 r。
  • 如果正确,Python 可以这样做:x = falsyVal or truthyVal.
  • "||" 是一种短路比较(例如TRUE || stop("reached") VS TRUE | stop("reached"))。在这种情况下,lo 被重新分配,直到其值 firstly 计算为 TRUE。例如。 (x &lt;- 1) || (x &lt;- 2) || (x &lt;- -1); x; (x &lt;- 0) || (x &lt;- 2) || (x &lt;- -1); x
  • 所以如果lo == 0,我们分配给hiabs(x[1])1中的任何一个,首先是非零,按这个顺序?
  • 是的,没错。

标签: r operators variable-assignment


【解决方案1】:

来自帮助文档:

& 和 && 表示逻辑 AND 和 |和 ||表示逻辑或。这 较短的形式执行元素比较的方式与 算术运算符。较长的形式从左到右计算 仅检查每个向量的第一个元素。评估收益 直到确定结果为止。较长的形式是合适的 用于编程控制流,通常在 if 子句中首选。

【讨论】:

    【解决方案2】:

    感谢一些有用的 cmets,我现在明白这意味着如果 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
    

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 2019-03-25
      • 2011-10-30
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 2016-09-07
      • 2020-11-01
      • 2011-10-31
      相关资源
      最近更新 更多