【问题标题】:error while using multiple if else function in R在R中使用多个if else函数时出错
【发布时间】:2015-01-14 16:13:14
【问题描述】:

我对 r 比较陌生,我想编写一个函数 calCS 来执行以下任务: 计算圆的面积(AC = pi*r^2),圆的周长(CC = 2*pi*r),球的体积(VS = (4/3)pi em>r3 或球的面积 (AS = 4*pi*r^2) .第一个参数是 AC、CC、VS 或 AS 来确定需要执行哪个计算 .第一个参数的值可以包含小写、大写或混合大小写的字母 (使用 toupper 功能) .如果参数的值不是 AC、CC、VS 或 AS,则停止函数并写入 ❵不支持你的方法✬ .第二个参数是半径 (r)。确保对这个问题使用 if ... else 语句。 我曾尝试使用多个 if else 语句,但一次又一次地遇到与括号相关的相同错误。

calCS <- function(x,r){
if(x="AC"){
a <- pi*r^2
print(a)
} 
} else {
  if(x="CC"){
b <- 2*pi*r
  print(b)
}else {
  if(x = "VS"){
  c <- (4/3)*3.14*(r^3)
  print(c)
}else {
  if(x = "AS"){
  d = 4*pi*(r^2)
  print(d)
}
}
}
} 

出现错误:“}”中出现意外的“}”

【问题讨论】:

  • 你应该看看使用else if (x == ....)。此外,这似乎更适合 switch
  • 另外,这读起来有点像家庭作业问题(尽管这里不一定是题外话)。

标签: r function loops if-statement


【解决方案1】:

你有两个主要问题。

  1. 您没有正确使用else if
  2. === 不同。

其他需要改进的地方(甚至在必须使用ifelse 的范围内)是你的函数不是很干。你有四个prints,一个就足够了。此外,缩进对可读性有很大帮助。


这里有一个虚拟函数可以帮助您入门。你显然知道如何定义你的函数并打印它们,所以你可以从那里进行替换:

calCS <- function(x, r) {
  if (!x %in% c("AC", "CC", "VS")) stop("Your method is not supported")
  if (x == "AC") {
    sprintf("I am a cat with %s toes", r)
  } else if (x == "CC") {
    sprintf("I wish I had %s toes", r)
  } else if (x == "VS") {
    sprintf("I just counted %s toes", r)
  }
}

函数示例:

calCS("AC", 3)
# [1] "I am a cat with 3 toes"
calCS("CC", 3)
# [1] "I wish I had 3 toes"
calCS("VS", 3)
# [1] "I just counted 3 toes"

而且,如果有不受支持的方法:

calCS("rat", 3)
# Error in calCS("rat", 3) : Your method is not supported

我将把 toupper 的集成和任何其他错误检查留给您,因为这与 if else 无关。

【讨论】:

    【解决方案2】:

    试试这个:

    calcCS <- function(x, r) {
      print_and_return <- function(x) { print(x); x }
      print_and_return(switch(x, AC = pi * r^2, CC = 2 * pi * r,
                                 VS = (4/3)*3.14*(r^3), 4*pi*(r^2)))
    }
    

    【讨论】:

    • 对我来说这不像if else。你没有正确阅读你的作业:-)
    • 我可以为所欲为!
    • 当你做你想做的事时,你为什么要定义一个名为print_and_return的函数?那不是将输出两次打印到控制台吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多