2016-09-21 2 views
0

Я хочу создать программу, в которой пользователю будет предложено ввести местоположение и на основании этого значения местоположения он должен запускать определенный набор кодов. Он должен ждать, пока пользователь не укажет значение местоположения.Подождите, пока пользователь не введет значение и на основе этого значения запустит набор кодов

readinteger <- function() 
{ 
    n <- readline(prompt="Enter your location: ") 
    n <- as.integer(n) 
    if (is.na(n)) 
    return(as.integer(n)) 
    } 

LC <- readinteger() 
    if (LC== 1) 
{ 
print(x) 
} 
else if (LC == 2) 
{ 
print(y) 
} 
else 
print(z) 

Но здесь переходит к если цикл непосредственно, а затем попросить ввести местоположение

+1

Что-то вроде этого? 'readinteger <- function() {n <- readline (prompt =" Введите ваше местоположение: "); n <- as.integer (n); if (is.na (n)) return (as.integer (n)); ifelse (n == 1, «код для 1», «код для 2»)} ' – Jimbou

+0

@Jimbou: ваш код работает, но для него требуются точки с запятой, потому что область комментариев лишила строки новой строки. 'readinteger <- function() {n <- readline (prompt =" Введите ваше местоположение: "); n <- as.integer (n); if (is.na (n)) {return (as.integer (n))}; ifelse (n == 1, print ("1 is n"), "code for 2");} ' Примечание: Это по сути тот же код, что и комментарий @Jimbou –

+0

BTW, проблема с кодом OP выглядит быть линией 'if (is.na (n))'. Это должно быть отрицание 'if (! Is.na (n))' –

ответ

0

Это будет нормально работать, если вы включите операторы if для управления печатью в вашей функции readinteger. Таким образом, readline будет вести себя так, как ожидалось (дождаться ввода от пользователя), а затем автоматически перейти к командам печати.

readinteger <- function() 
{ 
    n <- readline(prompt="Enter your location: ") 
    n <- as.integer(n) 

    x <- "You are at location one." 
    y <- "You are at location two." 
    z <- "You are lost." 

    if (n == 1) 
    { 
     print(x) 
    } 
    else if (n == 2) 
    { 
    print(y) 
    } 
    else 
    print(z) 
} 

readinteger() 

Вы имели if (is.na(n)) в своем коде, который не делает ничего, но я думаю, вы хотите, чтобы включать проверку, чтобы убедиться, что пользователь предоставил действительный вход. Если это так, вы можете найти цикл while полезным, поэтому пользователь может исправить свой ввод, если есть ошибка. Например:

readinteger <- function() 
{ 
    n <- NULL 
    while(!is.integer(n)){ 
    n <- readline(prompt="Enter your location: ") 
    n <- try(suppressWarnings(as.integer(n))) 
    if(is.na(n)) { 
     n <- NULL 
     message("\nYou must enter an integer. Please try again.") 
    } 
    } 

    x <- "You are at location one." 
    y <- "You are at location two." 
    z <- "You are lost." 

    if (n == 1) 
    { 
     print(x) 
    } 
    else if (n == 2) 
    { 
    print(y) 
    } 
    else 
    print(z) 
} 

readinteger() 
+0

Спасибо .. Надеюсь, это сработает отлично ... –

0

Ok. Я думаю, что это как-то связано с полным запуском всего файла. Он будет работать, если вы запустите его в Rsudio и выполните один шаг за раз, то есть в интерактивном режиме.

Согласно документации ?readline: `В неинтерактивном использовании результат будет таким, как если бы ответ был RETURN, а значение равно" ". В этом случае одним из вариантов является повторное вызов функции, как показано здесь: http://www.rexamples.com/4/Reading%20user%20input

Я не уверен на 100%, что это работает без задержек.

Для более комплексного решения вашей проблемы, вы можете увидеть этот вопрос: Make readline wait for input in R

(Примечание. Я добавляю это как ответ, просто потому что он ради форматирования Это не совсем ответ)

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