【发布时间】: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")VSTRUE | stop("reached"))。在这种情况下,lo被重新分配,直到其值 firstly 计算为TRUE。例如。(x <- 1) || (x <- 2) || (x <- -1); x; (x <- 0) || (x <- 2) || (x <- -1); x等 -
所以如果
lo == 0,我们分配给hi、abs(x[1])或1中的任何一个,首先是非零,按这个顺序? -
是的,没错。
标签: r operators variable-assignment