Emacs ESS:Eval region vs. source()

时间:2009-09-12 00:28:22

标签: emacs r ess

我喜欢Emacs ESS组合。我喜欢将命令行中的行,函数,区域和缓冲区发送到命令行进行评估,而无需使用鼠标。

但是,我注意到Emacs中的Eval Function命令比仅运行source("fns.R")要慢得多,其中fns.R是包含我要评估的函数的文件。< / p>

为什么会这样?

3 个答案:

答案 0 :(得分:8)

我认为ess list的人有更好的答案。但如果你无形地评估,那么处理速度要快得多。尝试将其放在.emacs文件中:

(setq ess-eval-visibly-p nil)

答案 1 :(得分:4)

我只是猜测,但是当你说

  • source("fns.R")你根本不涉及Emacs / ESS,计算时间只是R在文件中啜饮并消化它的时间 - 可能很少,而

  • Eval Function将一个区域传递给Emacs解释器,该解释器必须将它(可能是逐行)发送到R引擎,然后R引擎以零散的方式将其消化。

这会使第二种方法变慢。

然而,在宏伟的计划中,谁在乎呢?我经常发送整个缓冲区或大区域,这可能需要很长一段时间?我仍然认为 - 就像你说的那样 - (丰富的)编辑器和底层语言以这种方式进行交互的能力是非常强大的。

感谢Emacs黑客和ESS团队。

答案 2 :(得分:1)

如果你想执行你的整个缓冲区 - 如果你在Unix / Linux中,你也可以用shebang开始你的脚本:

#!/usr/bin/Rscript

让您的文件可执行

chmod 744 myscript.r

(我记得读过Google喜欢他们的r脚本以.R结尾但是哦......)你可以这样执行:

./myscript.r

而且,有了论据,

./myscript.r arg1 arg2

(我实际上用来从Matlab系统调用中调用R函数)和你的R文件中你可能会使用

userargs = tail(commandArgs(),2) 

获取arg1和arg2。你也可以不用shebang:

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

等等。在Windows中我记得它是

R CMD BATCH myscript.r

或其他相似的东西...我通过ESS运行命令时注意到了一点延迟(尽管我确实喜欢ESS 非常)所以当我知道我想要运行整个缓冲区时有时在R脚本(R缓冲区通常所在的位置)的窗口中启动一个shell并使用上面的技巧。

您也可以使用

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

- 使用这些方法而不是直接在R或R缓冲区中运行'source(“myscript.r”)'的好处是你开始使用一个清晰​​的工作区(尽管你应该小心你的。除非你在'myscript.r'中明确地调用'source(“〜/ .Rscript”)',否则不会加载Rprofile,所以你可以确定你的脚本是自包含的(它调用适当的库,你的词法作用域)函数不会引用您忘记删除的全局空间中的非预期变量,等等。