首页 > 解决方案 > R 当赋值 (a<-b) 可以返回 FALSE 如果 b 不能返回 FALSE

问题描述

我在 R 函数 bw.nrd0 中发现了一个非常奇怪的语法

bw.nrd0_test <- function (x)

{

    if(length(x) < 2L) stop("need at least 2 data points")

    hi <- sd(x)

    if(!(lo <- min(hi, IQR(x1)/1.34)))# qnorm(.75) - qnorm(.25) = 1.34898

        (lo <- hi) || (lo <- abs(x[1L])) || (lo <- 1.)

    0.9 * lo * length(x)^(-0.2)

}

什么时候分配可以返回 FALSE?我认为 min() 函数在任何情况下都不会返回 FALSE。我得到下面的语法,它一个接一个地尝试三个分配,并且第一个工作获胜,但是当像 lo <- hi 之类的东西如果 hi 不能为 FALSE 时再次返回 FALSE?

我试图在函数中引发错误,但我得到一个破坏条件的错误,而不是 FALSE。

标签: rsyntax

解决方案


好吧,虽然min可能无法返回布尔值,但“if”子句不一定需要布尔值。现在将它与 R 隐式返回操作的最后一个值结合起来,我们得到了该函数所利用的行为。

来自?bw.nrd0

它默认为标准偏差最小值的 0.9 倍和四分位距除以样本大小的 1.34 倍负五分之一幂(= Silverman 的“经验法则”,Silverman (1986, page 48, eqn (3.31)) )除非四分位数重合,否则肯定会得到肯定的结果。

现在如果我们检查如果lo被赋值为 0 会发生什么?

if(!(lo <- 0))
    print("We are now in the TRUE part of the if clause")

推荐阅读