代码之家  ›  专栏  ›  技术社区  ›  DanY

为什么我要和ifelse一起得到“警告南生产”?

r
  •  2
  • DanY  · 技术社区  · 6 年前

    我有一个非常简单的分段函数,它接受向量参数 omega

    btilde <- function(omega) {
            if(min(omega)<=0) stop("ALL ELEMENTS OF OMEGA MUST BE POSITIVE")
            ifelse( 0 < omega & omega <=  1, 0.233*omega^2,
            ifelse( 1 < omega & omega <=  3, 0.005*omega^4 - 0.06906*omega^3 + 0.3167*omega^2 - 0.02326*omega,
            ifelse( 3 < omega & omega <= 40, 0.705*sqrt(omega)*log(omega),
            ifelse(40 < omega,               sqrt(3*omega*log(omega) - log(8*pi) - 2/log(omega) - 170),
            NA))))
        }
    

    我得到一个“警告”如果 omega=c(1,41) 但如果 omega=1 omega=41 .

    > btilde(1)
    [1] 0.233
    > btilde(41)
    [1] 16.8228
    > btilde(c(1,41))
    [1]  0.2330 16.8228
    Warning message:
    In sqrt(3 * omega * log(omega) - log(8 * pi) - 2/log(omega) - 170) :
      NaNs produced
    

    NaN ifelse()

    2 回复  |  直到 6 年前
        1
  •  2
  •   mickey    6 年前

    ifelse 帮助页,

    当且仅当测试的任何元素为真时,将评估“是”,类似地,将评估“否”。

    FALSE ,如果任何其他元素 TRUE

    x = c(0, -1) 
    ifelse(x == 0, sqrt(x), x)
    
    [1]  0 -1
    Warning message:
    In sqrt(x) : NaNs produced
    

    它会产生与代码类似的警告。

        2
  •  3
  •   Mohammed Ali    6 年前

    我建议你关注算法中的一个元素,然后 map 你的函数被添加到一个列表中。

    library(purrr)
    
    btilde <- function(omega) {
      if (omega <= 0) stop("ALL ELEMENTS OF OMEGA MUST BE POSITIVE")
      if (omega <= 1) return (0.233*omega^2)
      if (omega <= 3) return (0.005*omega^4 - 0.06906*omega^3 + 0.3167*omega^2 - 0.02326*omega)
      if (omega <= 40) return(0.705*sqrt(omega)*log(omega))
      return(sqrt(3*omega*log(omega) - log(8*pi) - 2/log(omega) - 170))
    }
    

    输出如下:

    > map_dbl(c(1,41), ~ btilde(.x))
    [1]  0.2330 16.8228