我喜欢 Emacs ESS 组合。我喜欢在不使用鼠标的情况下将代码行、函数、区域和缓冲区发送到命令行进行评估。
但是,我注意到Eval Function
Emacs 中的命令比简单的运行要慢得多,包含我要评估的函数的文件source("fns.R")
在哪里。fns.R
为什么会这样?
我认为ess list上的人会为您提供更好的答案。但是,如果您进行无形评估,则处理速度要快得多。试着把它放在你的 .emacs 文件中:
(setq ess-eval-visibly-p nil)
我只是猜测,但当你说
source("fns.R")
你根本不涉及 Emacs/ESS,计算时间只是 R 吞入文件并消化它所花费的时间——可能很少,而
Eval Function
将一个区域传递给 Emacs 解释器,后者必须将它(可能是逐行)发送到 R 引擎,然后以零碎的方式消化它。
这将使第二种方法变慢。
然而,在宏伟的计划中,谁在乎呢?我经常发送整个缓冲区或大区域,这可能需要一秒钟的大部分时间?我仍然认为——正如你所说——(丰富的)编辑器和底层语言以这种方式交互的能力是非常强大的。
感谢 Emacs 黑客和 ESS 团队。
如果你想执行你的整个缓冲区——如果你在 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 下方的窗口中启动一个 shell脚本(R缓冲区通常驻留的地方)并使用上面的技巧。
你也可以使用
echo 'source("myscript.r")' | R --no-save
以及 - 使用这些方法而不是直接在 R 或 R 缓冲区中运行 'source("myscript.r")' 的好处是你从一个清晰的工作区开始(尽管你应该小心你的 .Rprofile 不会除非您在 'myscript.r' 中显式调用 'source("~/.Rscript")' ,否则将被加载,这样您就可以确保您的脚本是自包含的(它调用正确的库,您的词法范围函数不是t 在您忘记删除的全局空间中引用意外变量,依此类推)。