5

我喜欢 Emacs ESS 组合。我喜欢在不使用鼠标的情况下将代码行、函数、区域和缓冲区发送到命令行进行评估。

但是,我注意到Eval FunctionEmacs 中的命令比简单的运行要慢得多,包含我要评估的函数的文件source("fns.R")在哪里。fns.R

为什么会这样?

4

3 回答 3

8

我认为ess list上的人会为您提供更好的答案。但是,如果您进行无形评估,则处理速度要快得多。试着把它放在你的 .emacs 文件中:

(setq ess-eval-visibly-p nil)
于 2009-09-13T05:14:35.170 回答
4

我只是猜测,但当你说

  • source("fns.R")你根本不涉及 Emacs/ESS,计算时间只是 R 吞入文件并消化它所花费的时间——可能很少,而

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

这将使第二种方法变慢。

然而,在宏伟的计划中,谁在乎呢?我经常发送整个缓冲区或大区域,这可能需要一秒钟的大部分时间?我仍然认为——正如你所说——(丰富的)编辑器和底层语言以这种方式交互的能力是非常强大的。

感谢 Emacs 黑客和 ESS 团队。

于 2009-09-12T01:13:42.900 回答
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 下方的窗口中启动一个 shell脚本(R缓冲区通常驻留的地方)并使用上面的技巧。

你也可以使用

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

以及 - 使用这些方法而不是直接在 R 或 R 缓冲区中运行 'source("myscript.r")' 的好处是你从一个清晰的工作区开始(尽管你应该小心你的 .Rprofile 不会除非您在 'myscript.r' 中显式调用 'source("~/.Rscript")' ,否则将被加载,这样您就可以确保您的脚本是自包含的(它调用正确的库,您的词法范围函数不是t 在您忘记删除的全局空间中引用意外变量,依此类推)。

于 2009-09-12T10:43:37.047 回答