R语言如何限制scan()函数仅接收指定范围内的合法数值输入?
R语言实现
scan()输入范围校验+非法输入重试 需求说明
需要让scan()函数仅接收指定范围内的合法数值,用户输入不符合规则时重复触发输入流程,直到拿到合法值:
- 第一个输入值必须属于
1:4区间 - 第二个输入值必须属于
1:8区间
原有基础代码仅实现单次读取2个数值,无校验逻辑:
# Only allow 1:4 as first input and 1:8 as second input input <- scan(what = numeric(), n = 2, quiet = TRUE)
实现方案
核心逻辑是通过循环做输入校验,不符合规则就打印错误提示并重试,直到所有输入满足要求为止。
方案1:一次输入两个值的版本
和原有代码输入逻辑一致,要求用户一次输入2个数值,校验不通过整体重输:
# 配置各输入位的合法区间 valid_rules <- list( list(pos = 1, min = 1, max = 4, tip = "第一个值必须为1-4之间的整数"), list(pos = 2, min = 1, max = 8, tip = "第二个值必须为1-8之间的整数") ) repeat { input <- scan(what = numeric(), n = 2, quiet = TRUE, prompt = "请输入2个数值(第一个1-4,第二个1-8):") # 先判断输入长度是否符合要求 if (length(input) != 2) { cat("错误:请输入2个有效数值,请重试\n") next } # 逐个校验范围,默认要求是整数,不需要整数判断可删除`input[rule$pos] == floor(input[rule$pos])`部分 all_valid <- TRUE for (rule in valid_rules) { val <- input[rule$pos] if (val < rule$min || val > rule$max || val != floor(val)) { cat(paste0("输入错误:", rule$tip, ",请重试\n")) all_valid <- FALSE } } if (all_valid) break }
方案2:逐个输入的友好版本
分开提示用户输入每个值,单个值输错只需要重输当前值,不用全部重输:
# 封装通用的合法输入读取函数 read_valid_num <- function(prompt, min_val, max_val, is_integer = TRUE) { repeat { val <- scan(what = numeric(), n = 1, quiet = TRUE, prompt = prompt) valid <- length(val) == 1 && val >= min_val && val <= max_val if (is_integer) valid <- valid && val == floor(val) if (valid) return(val) err_tip <- ifelse(is_integer, "整数", "数值") cat(sprintf("输入无效,请输入%s到%s之间的%s,请重试\n", min_val, max_val, err_tip)) } } # 按规则读取两个输入 input1 <- read_valid_num("请输入第一个值(1-4):", 1, 4) input2 <- read_valid_num("请输入第二个值(1-8):", 1, 8) input <- c(input1, input2)
说明
- 如果不需要限制输入为整数,直接删除代码里的整数判断逻辑即可
- 后续要调整输入个数、合法范围,只要修改规则配置部分就行,不用改动核心校验逻辑
内容的提问来源于stack exchange,提问作者Amanda Bash
相关产品推荐
相关产品推荐

