制作函数时如何解决“不允许多参数返回”

时间:2019-09-09 14:13:42

标签: r function if-statement return

要学习如何创建函数,我正在尝试制作一个具有三种不同错误代码的平均值计算工具。但是,运行此代码时,我收到两个不同的错误消息。

如果我尝试avg(5),那只是一个数字,我会收到“缺少“ no”的参数,没有默认值”。并且在尝试avg("f")时,如果不是数字,则会出现错误:“不允许多参数返回” 。 我想要的是声明如果仅给出一个,则需要多个数字,并且如果给出一个字符,则参数必须为数字。我确实相信第二个问题可以通过某种“ Halt”命令解决,但是我的(可能太恐怖了)使用谷歌搜索并没有使我产生这样的问题。 感谢所有帮助,并在此先感谢!

avg <- function(x){
  ifelse(class(x) == "numeric" & length(x)>1,
         return(sum(x)/length(x)),
         ifelse(class(x)!= "numeric",
                return("Need to be numeric",
                       ifelse(length(x) <= 1,
                              return("Need more than one number"),
                              return("Unknown error")))))

  }

2 个答案:

答案 0 :(得分:3)

这仅是向您显示问题是您对localhost:8081的不当使用。仅当长度条件大于1时才应使用它。否则,应(在这种情况下必须)使用ifelseif

else

这里还有其他问题:

您不应返回这些消息。相反,您应该创建一个错误(使用avg <- function(x){ if (class(x) == "numeric" & length(x)>1) return(sum(x)/length(x)) else if (class(x)!= "numeric") return("Need to be numeric") else if (length(x) <= 1) return("Need more than one number") else return("Unknown error") } avg(5) #[1] "Need more than one number" avg("f") #[1] "Need to be numeric" avg(c(1.5, 1.6)) #[1] 1.55 )。

您应该使用stop而不是is.numeric(x)。对于整数,前者将为class(x) == "numeric",而后者则不会。

如果您TRUEelse(如果条件是return,则实际上不需要stop

答案 1 :(得分:0)

使用您的代码而无需简化即可使其正常工作:

avg <- function(x){
  ifelse(
    class(x) == "numeric" & length(x)>1,
    return(sum(x)/length(x)),
    ifelse(
      class(x)!= "numeric",
      return("Need to be numeric"),
      ifelse(length(x) <= 1,
        return("Need more than one number"),
        return("Unknown error")
      )
    )
  )
}

avg(numeric())
avg(1)
avg(c(1, 2))
avg("f")
avg(c(NA, 1))

请查看@Roland的答案,以提高代码质量。