2013-04-11 4 views
4

Я написал код, запрашивающий у пользователя либо ввести «2012», либо «2013». Затем у меня есть проверка цикла while, чтобы узнать, может ли пользователь вводить 2012 или 2013 год.Как исправить цикл while с несколькими условиями, возвращающими ошибку

Запрос на ввод допустимого года должен продолжаться до тех пор, пока пользователь не введет действительный номер. Тем не менее, я все время получаю сообщение об ошибке, когда появляется «{». Я не могу найти, почему это порождает такую ​​ошибку в моем коде.

Вот код:

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

Любая помощь будет оценена.

+0

Ваш код заполнен неправильным кодом R, например. 'year_of_data! = (2012 | 2013)' и 'if(), print()'. Также считайте свои открытые и закрытые скобки. Не звучать неряшливо, но я бы посоветовал вам прочитать некоторые учебники R, чтобы узнать, что такое правильный синтаксис R. –

+0

В чем этот вопрос может помочь другим? Мы не здесь, чтобы отлаживать ваш код. – agstudy

+0

Я в порядке с помощью отладки, но этот код выглядит только как R-код, когда на самом деле это не правильный R-код. –

ответ

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)) не была синтаксически правильной, поэтому я переключился на проверку, содержалось ли это значение в векторе c(2012,2013).

Наконец, вы следовали за if с запятой, а затем с заявлением на печать. Запятая - это еще одна синтаксическая ошибка. Поэтому я добавил фигурные скобки вокруг инструкции print и добавил предложение else, которое вырывается из цикла while, если пользователь ввел что-то правильно.

В более общем плане, вы можете изучить функцию menu для такого рода задач. Вероятно, это упростит проблему проверки.

+1

+1 за хорошо обработанный ответ, и не торопитесь, чтобы помочь кому-то выйти. –

+0

Спасибо, Джоран. Я очень ценю, что вы это делаете. Это очень полезно и помогает мне немного смотреть вниз. –

Смежные вопросы