我有以下代码:
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.25
,x=1.75
,x=1.95
处的密度。它毫无问题地运行,并计算x=1.25
的第一个值。但是,当尝试计算值x=1.75
和x=1.95
时,它返回并显示错误消息:
(x> = 1.5 && x <= 2)(4 *(2-x))中的错误: 尝试应用无功能
任何帮助将不胜感激。
我已经尝试去掉(4*(x-1))
和(4*(2-x))
周围的括号,但都不能解决问题,后者会返回意外的数字常量的错误。
答案 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