我正在解决我的R在线课程的任务。任务是编写一个函数,该函数使用拉格朗日解析子求解二次方程,或者:
x1<--p/2+sqrt((p/2)^2-q)
x2<--p/2-sqrt((p/2)^2-q)
1)如果参数是非数字的,则该函数应返回一个已解释的错误(或错误发生的原因)。 2)如果缺少参数,则函数应返回一个已解释的错误(不同于默认值)。 3)如果x1和x2是复数(例如,如果p = -4和q = 7,则x1 = 2 + i * 1.73和x2 = 2-i * 1.73),该函数还应该求解方程而不是生成NaN并返回警告消息,说明数字复杂。也许如果我以某种方式将其强制转换为as.complex,但我希望这是一种特殊情况,并且不想强制转换基本公式。
我的功能如下:
quadraticEquation<-function(p,q){
if(!is.numeric(c(p,q)))stop("p and q are not numeric") #partly works
if(is.na(c(p,q)))stop("there are argument/s missing") #does not work
x1<--p/2+sqrt((p/2)^2-q)
x2<--p/2-sqrt((p/2)^2-q)
#x1<--p/2+sqrt(as.complex((p/2)^2-q)) works, but I want to perform this only in case the numbers are complex
#x2<--p/2-sqrt(as.complex((p/2)^2-q))
return (c(x1,x2))
}
在测试功能时:
quadraticEquation(4,3) #basic case is working
quadraticEquation(TRUE,5) #non-numeric, however the if-statement is not executed, because it assumes that TRUE==1
quadraticEquation(-4,7) #complex number
1)如何编写该函数,使其假定为TRUE(不带“”),并且任何非数字的内容都视为非数字? 2)基本情况下,工作原理。 3)如何编写函数,以便求解方程式并打印出复数,并警告数字是复数(warning())?
答案 0 :(得分:1)
像这样吗?
tablayout
答案 1 :(得分:0)
在编写is.numeric(c(p, q))
时,R首先确定c(p, q)
,然后再确定其是否为数字。特别是如果p = TRUE
和q = 3
,则c(p, q)
被提升为更高的类型:c(1, 3)
。
这里是向量化的解决方案,因此,如果p
和q
是向量而不是标量,则结果也是向量。
quadraticEquation <- function(p, q) {
if (missing(p)) {
stop("`p` is missing.")
}
if (missing(q)) {
stop("`q` is missing.")
}
if (!is.numeric(p)) {
stop("`p` is not numeric.")
}
if (!is.numeric(q)) {
stop("`q` is not numeric.")
}
if (anyNA(p)) {
stop("`p` contains NAs.")
}
if (anyNA(q)) {
stop("`q` contains NAs.")
}
R <- p^2 / 4 - q
if (min(R) < 0) {
R <- as.complex(R)
warning("Returning complex values.")
}
list(x1 = -p / 2 + sqrt(R),
x2 = -p / 2 - sqrt(R))
}
此外,您永远不要写x1<--p/2
。在中缀运算符周围留空格:x1 <- -p/2
。