Emacs ESS: Eval регион и источник () - PullRequest
5 голосов
/ 12 сентября 2009

Мне нравится комбинация Emacs ESS. Я люблю отправлять строки, функции, регионы и буферы кода в командную строку для оценки без использования мыши.

Однако я заметил, что команда Eval Function в Emacs намного медленнее, чем просто запуск source("fns.R"), где fns.R - это файл, который содержит функцию, которую я хочу оценить.

Почему это так?

Ответы [ 3 ]

8 голосов
/ 13 сентября 2009

Я думаю, что у людей ess list есть лучшие ответы для вас. Но если вы оцениваете невидимо, обработка происходит намного быстрее. Попробуйте добавить это в ваш файл .emacs:

(setq ess-eval-visibly-p nil)
4 голосов
/ 12 сентября 2009

Я просто догадываюсь, но когда вы говорите

  • source("fns.R") вы вообще не используете Emacs / ESS, а вычислительное время - это просто время, которое R затрачивает в файле и переваривает его - возможно, очень мало, тогда как

  • Eval Function передает регион интерпретатору Emacs, который должен отправить его (предположительно построчно) в механизм R, который затем переваривает его по частям.

и это замедлит второй подход.

Тем не менее, в великом плане вещей, кого это волнует? Я часто посылаю целые буферы или большие регионы, и это может занять большую часть секунды? Я все еще думаю - как вы говорите - что способность (богатого) редактора и базового языка взаимодействовать таким образом является чем-то чрезвычайно мощным.

Слава хакерам Emacs и команде ESS.

1 голос
/ 12 сентября 2009

Если вы хотите выполнить весь буфер - если вы работаете в Unix / Linux, вы также можете запустить свой скрипт с помощью шебанга:

#!/usr/bin/Rscript

И сделайте ваш файл исполняемым

chmod 744 myscript.r

(я вспоминаю, что чтение Google любит, когда их скрипты r заканчиваются на .R, ну да ладно ...), и вы можете выполнить это так:

./myscript.r

А с аргументами

./myscript.r arg1 arg2

(который я фактически использовал для вызова функции R из системного вызова Matlab), и в вашем R-файле вы можете использовать

userargs = tail(commandArgs(),2) 

чтобы получить arg1 и arg2. Вы также можете обойтись без шебанга:

R --no-save < myscript.r arg1 arg2

и так далее. С Windows я помню, это было

R CMD BATCH myscript.r

или что-то в этом роде ... Я заметил небольшую задержку при запуске команд через ESS (хотя я очень люблю ESS 1023 *), поэтому, когда я знаю, что хочу запустить весь буфер, я иногда запустите оболочку в окне ниже сценария R (где обычно находится буфер R) и используйте описанные выше приемы.

Вы также можете использовать

echo 'source("myscript.r")' | R --no-save

также - преимущество использования этих методов перед запуском 'source ("myscript.r") непосредственно в R или буфере R заключается в том, что вы начинаете с чистого рабочего пространства (хотя вы должны быть осторожны с этим. Rprofile не будет загружен, пока вы не вызовете 'source ("~ / .Rscript") "явно в" myscript.r "), так что вы можете быть уверены, что ваш скрипт самодостаточен (он вызывает нужные библиотеки, ваши лексически ограниченные области) функции не ссылаются на непреднамеренные переменные в глобальном пространстве, которое вы забыли удалить и т. д.).

...