我喜欢Emacs ESS组合。我喜欢将命令行中的行,函数,区域和缓冲区发送到命令行进行评估,而无需使用鼠标。
但是,我注意到Emacs中的Eval Function
命令比仅运行source("fns.R")
要慢得多,其中fns.R
是包含我要评估的函数的文件。< / p>
为什么会这样?
答案 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,所以你可以确定你的脚本是自包含的(它调用适当的库,你的词法作用域)函数不会引用您忘记删除的全局空间中的非预期变量,等等。