要学习如何创建函数,我正在尝试制作一个具有三种不同错误代码的平均值计算工具。但是,运行此代码时,我收到两个不同的错误消息。
如果我尝试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")))))
}
答案 0 :(得分:3)
这仅是向您显示问题是您对localhost:8081
的不当使用。仅当长度条件大于1时才应使用它。否则,应(在这种情况下必须)使用ifelse
和if
:
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"
,而后者则不会。
如果您TRUE
或else
(如果条件是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的答案,以提高代码质量。