【问题标题】:Why am I receiving the error "Attempt to Apply Non-Function"为什么我收到错误“尝试应用非功能”
【发布时间】:2019-08-13 23:45:04
【问题描述】:

我有以下代码:

pdf=function(x) {
  if (x<=1 && x>2) 0 
  else if (1.5>x && x>1) (4*(x-1))
  else (x>=1.5 && x<=2) (4*(2-x))
}

我试图创建一个概率密度函数并计算x= 1.25x=1.75x=1.95 处的密度。它毫无问题地运行并计算x=1.25 的第一个值。但是,当尝试计算值 x=1.75x=1.95 时,它会返回错误消息:

(x >= 1.5 && x

任何帮助将不胜感激。

我已经尝试删除 (4*(x-1))(4*(2-x)) 周围的括号,两者都不能解决问题并且后者返回意外数字常量的错误。

【问题讨论】:

    标签: r


    【解决方案1】:

    您的问题是,else 不使用条件语句,并且只有在所有其他 if 语句都是 false 时才会执行。

    您必须在最终的else 中添加else if 语句,以便实际使用条件。

    编辑:正如@Shree 在 cmets 中指出的那样,您的初始 if 语句将永远无法到达,并且应该是 OR 运算符而不是 AND

    pdf=function(x) {
      if (x<=1 || x>2) 0 
      else if (1.5>x && x>1) (4*(x-1))
      else if (x>=1.5 && x<=2) (4*(2-x))
    }
    

    正如@Tim Biegeleisen 在 cmets 中指出的那样,最终的else if 可能不是特别需要,您可以改为执行以下操作

    pdf=function(x) {
      if (x<=1 || x>2) 0 
      else if (1.5>x && x>1) (4*(x-1))
      else (4*(2-x))
    }
    

    【讨论】:

    • 最后一个条件也可以是else
    • x&lt;=1 &amp;&amp; x&gt;2 将如何成为TRUE
    • 我已经编辑了答案以纳入这些事实,谢谢
    【解决方案2】:

    这里有两种矢量化方式,一种是ifelse,另一种是逻辑索引。

    pdf <- function(x) {
      ifelse(x <= 1 | x > 2, 0, 
             ifelse(1 < x & x < 1.5, 4*(x - 1), 4*(2 - x)
             )
      )
    }
    
    pdf2 <- function(x){
      i <- 1 < x & x < 1.5
      j <- 1.5 <= x & x <= 2
      y <- rep(0, length(x))
      y[i] <- 4*(x[i] - 1)
      y[j] <- 4*(2 - x[j])
      y
    }
    
    X <- seq(-1, 3, by = 0.1)
    identical(pdf(X), pdf2(X))
    #[1] TRUE
    

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2018-06-09
      • 2022-01-26
      相关资源
      最近更新 更多