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

R函数中的复数和缺失参数,r,arguments,R,Arguments,我正在为我的R在线课程解决一项任务。任务是编写一个函数,用拉格朗日分解法求解二次方程,或: x1<--p/2+sqrt((p/2)^2-q) x2<--p/2-sqrt((p/2)^2-q) 1) 如何编写该函数,使其假定为TRUE(不带“”),而任何非数字的内容都视为非数字? 2) 基本情况下,工程。 3) 如何编写函数,使其解方程并打印复数,同时警告数字是复数(warning())?类似的内容 quadraticEquation <- function(p, q){

我正在为我的R在线课程解决一项任务。任务是编写一个函数,用拉格朗日分解法求解二次方程,或:

x1<--p/2+sqrt((p/2)^2-q)
x2<--p/2-sqrt((p/2)^2-q)
1) 如何编写该函数,使其假定为TRUE(不带“”),而任何非数字的内容都视为非数字? 2) 基本情况下,工程。 3) 如何编写函数,使其解方程并打印复数,同时警告数字是复数(warning())?

类似的内容

quadraticEquation <- function(p, q){
  ## ------------------------% chek the arguments %---------------------------##
  if(
    missing(p) | missing(q)                              # if any of arguments is 
  ){                                                     # missing - stop.
    stop("[!] There are argument/s missing")
  }
  else if(
    !is.numeric(p) | !is.numeric(q) | any(is.na(c(p, q))) # !is.numeric(c(1, T))
  ){                                                     # returns TRUE - conver-    
    stop("[!] Argument/s p or/and q are not numeric")    # tion to the same type
  }
  ## --------------------% main part of the function %--------------------------##  
  r2 <- p^2 - 4*q                                        # calculate r^2,
  if(r2 < 0){                                            # if r2 < 0 (convert) it 
    warning("equation has complex roots")                # to complex and warn
    r2 <- as.complex(r2)
  }
                                                         # return named roots
  setNames(c(-1, 1) * sqrt(r2)/2 - p/2, c("x1", "x2"))
}

quadraticEquation()                                      # No arguments provided
#Error in quadraticEquation() : [!] There are argument/s missing
quadraticEquation(p = 4)                                 # Argument q is missing
#Error in quadraticEquation(p = 4) : [!] There are argument/s missing
quadraticEquation(p = TRUE, q = 7)                       # p is logical
#Error in quadraticEquation(p = TRUE, q = 7) : 
#[!] Argument/s p or/and q are not numeric
quadraticEquation(p = NA, q = 7)                         # p is NA
#Error in quadraticEquation(p = NA, q = 7) : 
#[!] Argument/s p or/and q are not numeric
quadraticEquation(p = 7, q = -4)                         # real roots
#        x1         x2 
#-7.5311289  0.5311289 
quadraticEquation(p = -4, q = 7)                         # complex roots
#         x1          x2 
#2-1.732051i 2+1.732051i
#Warning message:
#In quadraticEquation(p = -4, q = 7) : equation has complex roots

quadraticEquation当你写
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))
}

quadraticEquation绝妙的解决方案!我可以问一下,如果x1和x2相等(例如,当p=-4和q=4时),如何返回只有一个元素(x1)的向量吗?也许可以尝试
unique()
它将返回唯一的值,因此
unique(c(1,1))返回
1`不起作用,在集合名中返回错误:缺少参数“nm”,没有默认值。(这个论点是什么?)是的,对不起,思维不好。所以像这样划分:-计算根:
quadraticEquation <- function(p, q){
  ## ------------------------% chek the arguments %---------------------------##
  if(
    missing(p) | missing(q)                              # if any of arguments is 
  ){                                                     # missing - stop.
    stop("[!] There are argument/s missing")
  }
  else if(
    !is.numeric(p) | !is.numeric(q) | any(is.na(c(p, q))) # !is.numeric(c(1, T))
  ){                                                     # returns TRUE - conver-    
    stop("[!] Argument/s p or/and q are not numeric")    # tion to the same type
  }
  ## --------------------% main part of the function %--------------------------##  
  r2 <- p^2 - 4*q                                        # calculate r^2,
  if(r2 < 0){                                            # if r2 < 0 (convert) it 
    warning("equation has complex roots")                # to complex and warn
    r2 <- as.complex(r2)
  }
                                                         # return named roots
  setNames(c(-1, 1) * sqrt(r2)/2 - p/2, c("x1", "x2"))
}

quadraticEquation()                                      # No arguments provided
#Error in quadraticEquation() : [!] There are argument/s missing
quadraticEquation(p = 4)                                 # Argument q is missing
#Error in quadraticEquation(p = 4) : [!] There are argument/s missing
quadraticEquation(p = TRUE, q = 7)                       # p is logical
#Error in quadraticEquation(p = TRUE, q = 7) : 
#[!] Argument/s p or/and q are not numeric
quadraticEquation(p = NA, q = 7)                         # p is NA
#Error in quadraticEquation(p = NA, q = 7) : 
#[!] Argument/s p or/and q are not numeric
quadraticEquation(p = 7, q = -4)                         # real roots
#        x1         x2 
#-7.5311289  0.5311289 
quadraticEquation(p = -4, q = 7)                         # complex roots
#         x1          x2 
#2-1.732051i 2+1.732051i
#Warning message:
#In quadraticEquation(p = -4, q = 7) : equation has complex roots
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))
}