4

我编写了代码,要求用户输入“2012”或“2013”​​。然后我会while循环检查用户输入的是 2012 还是 2013。

输入有效年份的请求应该一直持续到用户输入有效数字为止。但是,我不断收到一个错误,即发生意外的“{”。我找不到为什么会在我的代码中产生这样的错误。

这是代码:

yr_function <-function(){
   year_of_data <- as.numeric(readline("Is the year of concern 2012 or 2013? >>> "))
}

year_of_data = 0
While((year_of_data != 2012) | (year_of_data != 2013)){
    yr_function
if(year_of_data != (2012 | 2013),print("You must type either 2012 or 2013")
}

有错误生成读取:

Error: unexpected '{' in "While((year_of_data != 2012) | (year_of_data != 2013)){"

任何帮助将非常感激。

4

1 回答 1

14

您已经大致了解了这里的总体思路,但是您在几个地方都被简单的错误绊倒了。这是一个注释版本,如您所描述的那样工作:

yr_function <-function(){
   res <- as.numeric(readline("Is the year of concern 2012 or 2013? >>> "))
   if (is.na(res)){
    res <- -1
   }
   res
}

您的第一个问题与范围有关。您在此函数内部和循环year_of_data之前都定义了。while但是在函数内部创建的变量不会引用while循环之前的变量。它们存在于不同的环境中。所以我修改了这个函数,改为返回用户输入的值。

您没有太多讨论验证,这是一个很大的话题。我在这里添加了一个非常小的验证。基本上,如果用户输入的东西不能被合理地强制转换为数字,那么你会得到一个 NA 值,这将是一个令人头疼的问题。所以我只是检查它并在这种情况下返回 -1。这不是验证问题的完整解决方案。

year_of_data <- 0
while((year_of_data != 2012) & (year_of_data != 2013)){
    year_of_data <- yr_function()
    if (!year_of_data %in% c(2012,2013)){
        print("You must type either 2012 or 2013")
    }else{
        break
    }
}

这是固定while循环。首先,我修复了一些简单的语法错误(while不是While等)。然后我将结果分配yr_function()year_of_data,这样我们就可以检查结果值并采取相应的行动。

if您对条件 ( )的尝试在year_of_data != (2012 | 2013)语法上不正确,因此我转而检查该值是否包含在 vector 中c(2012,2013)

最后,您在后面if加上逗号,然后是打印语句。逗号是另一个语法错误。所以我在print语句周围添加了大括号,并添加了一个子句,如果用户输入了正确的内容,则该else子句会跳出循环。while

更一般地,您可能想要研究menu此类任务的功能。它可能会使验证问题更容易处理。

于 2013-04-12T03:13:00.090 回答