r - 如何在运行时向用户询问一个整数,并递归地再次询问您是否没有得到一个?
问题描述
我正在尝试编写一些执行以下所有操作的代码:
- 在运行时,用一个实际的问题(例如“你有多少台 PC?”)询问用户输入一个整数。
- 检查用户是否给出了整数类型的对象或可以强制输入而没有错误的对象。此步骤不得要求任何类型的
grep
(例如,使此解决方案无效)。 - 如果输入不是整数,不要给出任何警告或错误,而是提出一个重复的新问题,直到他们给出一个整数(例如,问“再试一次?”直到给出一个整数)。
- 输出此整数。
类似 问题的解决方案似乎是使用scan
or 或readlines
。我已经排除了,scan
因为它喜欢抛出自己的错误消息,需要帮助print
来提问,并且如果给出无效的输入,即使你告诉它只尝试一个(例如scan(n = 1,quiet = TRUE)
会要求如果你给它一堆字母,另一个输入)。我发现这readlines
几乎令人满意,但是因为readlines
将其输入视为字符串,所以我无法编写trycatch
满足要求 3 的块。
我有哪些选择?看起来我错过了一个简单的解决方案。
解决方案
我们可以使用递归函数或while
orrepeat
循环来检查答案是否为数字
f1 <- function(question){
flag <- TRUE
while(flag) {
out <- readline(paste0(question, "\n"))
out1 <- type.convert(out, as.is = TRUE)
if(is.numeric(out1)) flag <- FALSE
}
out1
}
v1 <- f1('how many PCs')
how many PCs
not sure
how many PCs
you asked the wrong person
how many PCs
#2432
how many PCs
20
v1
#[1] 20
或者另一种选择是使用 转换为整数as.integer
。如果有任何值不是整数/数字,它将返回 NA。使用is.na
作为逻辑条件,我们可以更改if
上面代码中的行
推荐阅读
- java - 调用方法还是强制转换(优先级)?
- javascript - 下载 .pdf 并重定向到另一个页面
- google-api - Google Calendar API 的 Sync Token 如何针对每个请求使用不同的请求过滤器(timeMin、timeMax)?
- azure - 在 powershell 中解析模板
- bash - 在继续之前在循环功能中下载两个配对文件
- sql - 在具有 2 列主键的表上定义 H2 数据库中的外键约束
- excel - 当在 VBA excel 中达到特定输出时,有没有办法存储输入值
- mysql - 我想在用户选择的白天和结束白天之间的表上创建 EEVENT_SCHEDULER,它在用户选择开始日期和时间时创建一次
- excel - 当我在 excel 中使用 VLOOKUP 函数时,我试图从一个数字集中获得一个字母等级,我没有得到正确的字母
- excel - Workbooks.Open VBA 代码行在 Excel 中结束了我的 F8 步骤并运行宏(就像我点击了 F5 一样)