пользовательский ввод и ESS - PullRequest
2 голосов
/ 04 декабря 2010

Когда вы просите ESS оценить следующее из буфера (C-c, C-b или аналогичное)

par(ask=TRUE)
plot(1,1)
plot(2,1)

Интерпретатор заходит в бесконечный цикл, потому что ESS начинает сеанс R с аргументом --no-readline. Цикл может быть прерван с помощью C-g, но есть ли способ заставить интерпретатор фактически запросить ввод данных пользователем?

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Решение состоит в том, чтобы отредактировать ess-r-d.el и удалить жестко заданную опцию --no-runtime, заданную для R, это строка 127 последней реализации.

Изменение

  (let* ((r-always-arg
      (if (or ess-microsoft-p (eq system-type 'cygwin))
          "--ess "
        "--no-readline "))

до

  (let* ((r-always-arg
      (if (or ess-microsoft-p (eq system-type 'cygwin))
          "--ess "))

Если есть скомпилированная версия, вы должны скомпилировать .el, чтобы сгенерировать и заменить двоичный файл .elc.

Файл может быть (расположение каталога зависит от вашей ОС)

  • в каталоге site-lisp. Отредактируйте файл .el в emacs (^ X ^ F), затем выполните M-x byte-compile-file, чтобы сгенерировать .elc.

  • , если вы установили из всего исходного пакета zip / tar, в каталог lisp. В этом случае после изменения выполните make, а затем make install.

Вам, конечно, нужно иметь write доступ к файлам .el и .elc.

Если вам не нравится компиляция файла .el, вы можете просто удалить его (.elc) и использовать только версию .el (должна быть лишь небольшая разница в производительности).

0 голосов
/ 05 декабря 2010

(Стратегии, полученные от Google и RSiteSearches):

Видите ли вы приглашение "нажать Return" в любом из ваших окон сеанса?Если это так ... нажмите.

Если нет, попробуйте щелкнуть мышью в окне графика.

И если это не удастся, вы должны вернуть контроль с помощью cG.

Редактировать: Еще одна стратегия, которая, по общему признанию, не решает проблему неинтерактивности ESS: если вы хотите сохранить для пользовательского ввода, тогда можно использовать readLines:

input=file("stdin")
print(readLines(input,1))
...