首页 > 解决方案 > 如何在运行时向用户询问一个整数,并递归地再次询问您是否没有得到一个?

问题描述

我正在尝试编写一些执行以下所有操作的代码:

  1. 在运行时,用一个实际的问题(例如“你有多少台 PC?”)询问用户输入一个整数。
  2. 检查用户是否给出了整数类型的对象或可以强制输入而没有错误的对象。此步骤不得要求任何类型的grep(例如,使此解决方案无效)。
  3. 如果输入不是整数,不要给出任何警告或错误,而是提出一个重复的新问题,直到他们给出一个整数(例如,问“再试一次?”直到给出一个整数)。
  4. 输出此整数。

类似 问题的解决方案似乎是使用scanor 或readlines。我已经排除了,scan因为它喜欢抛出自己的错误消息,需要帮助print来提问,并且如果给出无效的输入,即使你告诉它只尝试一个(例如scan(n = 1,quiet = TRUE)会要求如果你给它一堆字母,另一个输入)。我发现这readlines几乎令人满意,但是因为readlines将其输入视为字符串,所以我无法编写trycatch满足要求 3 的块。

我有哪些选择?看起来我错过了一个简单的解决方案。

标签: rinteger

解决方案


我们可以使用递归函数或whileorrepeat循环来检查答案是否为数字

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上面代码中的行


推荐阅读