我喜欢Emacs和ESS的组合。我喜欢不使用鼠标将代码的行、函数、区域和缓冲区发送到命令行以进行评估。
然而,我注意到Emacs中的Eval Function
命令比简单运行source("fns.R")
要慢得多,其中fns.R
是包含我想要评估的函数的文件。
为什么会这样呢?
我认为在ess列表中的人会给你更好的答案。但是如果你进行隐式评估,处理速度会快得多。尝试将以下内容放入您的.emacs文件中:
(setq ess-eval-visibly-p nil)
source("fns.R")
时,并没有涉及到 Emacs/ESS,计算时间只是 R 读取并解析文件的时间,这可能非常短。而 Eval Function
则会将区域传递给 Emacs 解释器,后者需要将其逐行发送到 R 引擎中,然后以分块方式进行解析,因此第二种方法会更慢。#!/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脚本下方的窗口中启动一个shell,并使用上述技巧。
你也可以使用
echo 'source("myscript.r")' | R --no-save
同样,使用这些方法而不是直接在R或R缓冲区中运行“source(“myscript.r”)”的好处在于,您从一个清晰的工作空间开始(尽管您应该小心,除非您在“myscript.r”中显式调用“source(“~/.Rscript”)”,否则您的.Rprofile将不会被加载),因此您可以确保您的脚本是自包含的(它调用正确的库,您的词法作用域函数没有引用您忘记删除的全局空间中的意外变量等)。