如何解决如何使用 grepl 验证用户输入的条件
我正在尝试将 R 基础作为个人挑战。不过,我并不承诺使用 grepl,这只是我的第一个想法。我遇到了障碍。
这是我目前所拥有的:
armstrong <- function(x) {
if (grepl("^[-]{0,1}[0-9]{0,}.{0,1}[0-9]{1,}$",x) == FALSE) {
stop("Please try submitting a valid number")
}
else {
temp <- strsplit(as.character(x),split = "")
y <- sapply(temp,function(y)sum(as.numeric(y)^length(y)))
if (y == x) {
print(paste("The number you entered,",x,is an Armstrong number"))
}
else {
print(paste("The number you entered,is not an Armstrong number"))
}
}
}
armstrong(readline(prompt = "Please enter a three digit positive number"))
程序检查用户是否输入了 Armstrong number。那部分工作。我所坚持的是用户输入的错误处理。如果用户输入负数,或者如果他们输入数字之间的字符(例如 1a4),我将无法让 grepl 输出 FALSE。如果 grepl 在用户输入的数字不是 3 位数字时输出 FALSE 那就太好了,但这没什么大不了的,因为该函数仍然可以工作。
如何更新正则表达式以帮助处理错误?
解决方法
为什么不只是
if (! is.numeric(x) || x < 0) stop(…)
换句话说:使用正确的类型。如果输入应该是数字,则不要接受字符串。
如果您需要接受一个字符串,将该字符串转换为数字并测试转换是否成功。您可以测试 NA
以检查它是否成功。
我还建议对该功能进行一些其他更改:
armstrong <- function (x) {
num <- as.numeric(x)
if (is.na(num) || num < 0) stop("Please try submitting a valid number")
digits <- strsplit(x,"")[[1L]]
sum <- sum(as.numeric(digits) ^ length(digits))
msg <- paste0(
"The number you entered,",x,is ",if (num != sum) "not " else "","an Armstrong number"
)
message(msg)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。