为什么会收到错误“尝试应用非功能”

时间:2019-08-13 23:45:04

标签: r

我有以下代码:

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 <= 2)(4 *(2-x))中的错误:     尝试应用无功能

任何帮助将不胜感激。

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

2 个答案:

答案 0 :(得分:3)

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

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

编辑:正如@Shree在评论中指出的那样,您的初始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)) }

else if

正如@Tim Biegeleisen在评论中指出的那样,最终的pdf=function(x) { if (x<=1 || x>2) 0 else if (1.5>x && x>1) (4*(x-1)) else (4*(2-x)) } 并不是特别必要,您可以执行以下操作

void FillData()
{
string constring = (@"Data Source=(local);Initial Catalog=UnifaceDB;Integrated Security=True");
string Query = "select Code,Module1,Module2,Module3 from prof where Code='" + txtAssignement.Text+"'";
SqlConnection conDataBase = new SqlConnection(constring);
SqlCommand cmdDataBase = new SqlCommand(Query, conDataBase);
SqlDataReader myReader;
conDataBase.Open();
myReader = cmdDataBase.ExecuteReader();
while (myReader.Read())
    {
    string sName = myReader.GetString(myReader.GetOrdinal("Module1"));
    comboBox1.Items.Add(sName);
    string sName2 = myReader.GetString(myReader.GetOrdinal("Module2"));
    comboBox1.Items.Add(sName2);
    string sName3 = myReader.GetString(myReader.GetOrdinal("Module3"));
    comboBox1.Items.Add(sName3);
    }
}

答案 1 :(得分:0)

这里有两种向量化方式,一种使用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