如何修复带有多个条件的while循环返回错误的问题

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)){"

非常感谢您的帮助。


你的代码中充满了不正确的R代码,例如year_of_data != (2012 | 2013)if(),print()。同时,请检查一下你的开放和关闭括号是否匹配。我不是要挖苦你,但我建议你阅读一些R教程,以了解正确的R语法。 - Paul Hiemstra
我很乐意帮助调试,但是这段代码看起来只是R代码,实际上它并不是正确的R代码。 - Paul Hiemstra
我知道你们两个都是比较敏感的人,所以我希望我的问题没有伤害到你们的感情。具体来说,我认为代码是正确的,特别是基于我在R中阅读的书籍。显然不是这样的,所以我的误解在于while结构 - 如问题所述。为什么会出现错误?因为就我所知,如果(condition,resultant)中的条件成立,我可以得到一个结果,或者我可以写if(condition){resultant}。我确实理解,也许条件在if条件中写得不好。 - Jonathan Charlton
6
在我看来,这个问题得到的回答与其质量不太成比例。在游说撤销删除后,当我写了一个相当冗长的答案时,第五个关闭投票出现了。我希望能得到一些重新开放的投票。谢谢! - joran
1个回答

14
你已经掌握了这里应该有的一般想法,但是在几个地方被简单错误绊倒了。 这是一个带注释的版本,它可以像你描述的那样工作:
yr_function <-function(){
   res <- as.numeric(readline("Is the year of concern 2012 or 2013? >>> "))
   if (is.na(res)){
    res <- -1
   }
   res
}

你面临的第一个问题涉及作用域。你在函数内和while循环前定义了year_of_data变量。但是,函数内创建的变量不会引用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`应为小写,而不是大写等)。然后,我将yr_function()的结果赋值给year_of_data,以便我们可以检查结果值并相应地采取行动。

你尝试的if条件(year_of_data!=(2012 | 2013))在语法上不正确,所以我改用检查该值是否包含在向量c(2012,2013)中。

最后,你在if后面跟了一个逗号,然后是一个打印语句。逗号是另一个语法错误。因此,我在print语句周围添加了括号,并添加了一个else子句,如果用户输入正确内容,则退出while循环。

更一般地说,您可能希望调查menu函数以完成此类任务。它可能会使验证问题变得更简单。


1
对于精心制作的回答并花时间帮助他人,给予+1。 - Paul Hiemstra
谢谢Joran。我非常感激你做这件事。这非常有帮助,让我能够提前规划一下。 - Jonathan Charlton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接