пользовательский ввод в R (командная строка Rscript и Widows)

Я пытаюсь выяснить, как я могу запустить r-скрипт, используя Rscript в командной строке Windows и запрашивая ввод пользователя.

До сих пор я нашел ответы о том, как запрашивать ввод данных пользователем в интерактивной оболочке R. Любые попытки сделать то же самое с readline() или scan() не увенчались успехом.

пример:

У меня есть многочлен y=cX, где X может принимать более одного значения X1,X2,X3 и так далее. Переменная C известна, поэтому для вычисления значения y мне нужно запросить у пользователя значения Xi и сохранить их где-нибудь внутри моего скрипта.

Uinput <- function() {
    message(prompt"Enter X1 value here: ")
    x <- readLines()
}

Это путь? Какие-то дополнительные аргументы? as.numeric поможет? Как вернуть X1? И будет ли реализация отличаться в зависимости от ОС?

Спасибо.


person Community    schedule 06.04.2014    source источник


Ответы (1)


Это общий путь, но над реализацией нужно поработать: вам не нужны readLines, вам нужны readline (да, название похожее. Да, это глупо. R наполнен глупостями;).

То, что вы хотите, это что-то вроде:

UIinput <- function(){

    #Ask for user input
    x <- readline(prompt = "Enter X1 value: ")

    #Return
    return(x)
}

Однако вы, вероятно, захотите выполнить некоторую обработку ошибок (я мог бы предоставить значение X1 FALSE или «репа») и некоторое преобразование типов, поскольку readline возвращает вектор символов с одной записью: любой предоставленный числовой ввод, вероятно, должен быть преобразуется в числовой ввод. Таким образом, хороший, удобный способ сделать это может быть...

UIinput <- function(){

    #Ask for user input
    x <- readline(prompt = "Enter X1 value: ")

    #Can it be converted?
    x <- as.numeric(x)

    #If it can't, be have a problem
    if(is.na(x)){

         stop("The X1 value provided is not valid. Please provide a number.")

    }

    #If it can be, return - you could turn the if into an if/else to make it more
    #readable, but it wouldn't make a difference in functionality since stop()
    #means that if the if-condition is met, return(x) will never actually be
    #evaluated.
    return(x)
}
person Community    schedule 06.04.2014
comment
Единственная проблема заключается в том, что хотя код работает гладко и без ошибок, в терминале ничего не происходит. Буквально ничего.. - person ; 07.04.2014
comment
Это странно. Я предполагаю, что вы на самом деле вызываете функцию? - person ; 07.04.2014
comment
Хорошо, я нашел ответ, который искал в другом месте. Тем не менее спасибо за старание - person ; 08.04.2014
comment
@KapelNick, не оставляйте нас в покое - как вы это решили? :). - person ; 08.04.2014
comment
cat("blablabla: ") x <- readLines(con="stdin", 1) x <- as.numeric(x) работал на меня - person ; 09.04.2014
comment
Это сработает, но я не понимаю, почему приведенное выше решение не сработало. Как ты его запускал? - person ; 09.04.2014
comment
Ну, я попробовал несколько вариантов кода без какого-либо успеха. Это сработало для вас? Я мог бы попытаться реализовать это снова в будущем и посмотреть, почему это не сработало. Пока что мой график плотный. - person ; 10.04.2014
comment
Я считаю, что решение user347128 работает, если вы заключаете вызовы в фигурные скобки: { username <- UIinput() password <-UIinput() } - person user1761806; 15.05.2018