R函数中的复数和缺少的参数

时间:2018-06-23 04:39:11

标签: r arguments

我正在解决我的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())?

2 个答案:

答案 0 :(得分:1)

像这样吗?

tablayout

答案 1 :(得分:0)

在编写is.numeric(c(p, q))时,R首先确定c(p, q),然后再确定其是否为数字。特别是如果p = TRUEq = 3,则c(p, q)被提升为更高的类型:c(1, 3)

这里是向量化的解决方案,因此,如果pq是向量而不是标量,则结果也是向量。

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