остановка скрипта, пока значение не будет введено с клавиатуры в R - PullRequest
3 голосов
/ 01 апреля 2011

У меня есть скрипт, и я хочу запустить его с клавиатуры, а затем продолжить работу на основе значения, введенного в эту переменную, я попытался y=readline("please enter a value"), но скрипт не будет ждать ввода значения,просто покажите это предложение и продолжайте, как это можно сделать ???заранее спасибо ??

Ответы [ 3 ]

6 голосов
/ 02 апреля 2011

Вот очень простой #! скрипт, который создает функцию foo(), единственной целью которой является отозвать его аргумент 'bar'.

#! /home/gavin/R/2.13-patched/build/bin/Rscript --vanilla
foo <- function(bar) {
    writeLines(paste("You supplied the following information:", bar))
}

## grab command arguments passed as -args
args <- commandArgs(TRUE)

## run foo
foo(args)

Мы получаем любые аргументы командной строки, переданные всценарий из оболочки с использованием функции commandArgs(), а затем передать его в foo() с последней строкой сценария.

Если у нас есть этот бит кода в файле foobar.R, то мы можемпередайте аргумент и запустите скрипт, используя интерфейс Rscript.Вы также должны сделать вышеупомянутый исполняемый файл (chmod it).

Тогда скрипт можно назвать как и он работает следующим образом:

[gavin@desktop ~]$ ./foobar.R Cl
You supplied the following information: Cl

Но обратите внимание на информацию в ?Rscript как, к сожалению, стандартные командные оболочки Windows не знают о #! подобных скриптах, поэтому вам может потребоваться установить другую оболочку (справка предполагает, что оболочка Cygwin должна работать), чтобы использовать функциональность, которую я показываю.

Обновление: Использование source() и readline().

Альтернатива, если вы можете обойтись без неинтерактивного запуска (т. Е. Вы не открываете R GUI изапустить одну строку кода), это просто source() сценарий.Например, если это было в вызове сценария barfoo.R:

dynamicwilcox <- function() {
    ANSWER <- readline("What column do you want to work on? ")
    if(ANSWER=="Ph") {
        writeLines("column was 'Ph'")
    } else if(ANSWER=="Cl") {
        writeLines("column was 'Cl'")
    } else {
        writeLines(paste("Sorry, we don't know what to do with column", ANSWER))
    }
    ANSWER ## return something
}

dynamicwilcox()

Затем из командной строки R Gui, мы могли бы сделать:

R> source("barfoo.R")
What column do you want to work on? Cl
column was 'Cl'

или если вы не хотитечтобы указать полный путь, сделайте следующее:

R> source(file.choose())

readline() прекрасно работает при использовании в интерактивном сеансе R и действительно является лучшим инструментом для работы - это именно то, для чего он предназначен.

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

2 голосов
/ 01 апреля 2011

Вы, вероятно, хотите scan(), что-то вроде:

print("please enter a value")
y <- scan(file = "", what = "", nmax = 1)

scan() будет ждать ввода пользователя, и любой текст будет сохранен в y - в данном случае в векторе символа режима.

0 голосов
/ 03 июня 2015

У меня была такая же проблема в Ubuntu (не в Windows) и я нашел решение.

Вместо Rscript используйте littler (/usr/bin/r) и обязательно передайте интерактивный флаг -i littler. Эта комбинация убеждает readline() работать в скрипте так, как нужно:

#!/usr/bin/r -vi

eprintf <- function(...) cat(sprintf(...), sep='', file=stderr())

prompt.read <- function(prompt="\n[hit enter to continue]: ") {
    eprintf("%s", prompt)
    invisible(readline())
}

ans <- prompt.read('Please enter a value: ')
eprintf("You have entered: '%s'\n", ans)

# rest of script comes here...

Когда я запускаю его как скрипт, я получаю:

$ ./rl.r
Please enter a value: 42
You have entered: '42'

$ ./rl.r
Please enter a value: Hello to you!
You have entered: 'Hello to you!'

Чтобы установить littler (в Ubuntu):

sudo apt-get install littler
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...