我喜欢 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 解释器,Emacs 解释器必须将其发送(大概是逐行)到 R 引擎,然后 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 引用全局空间中您忘记删除的非预期变量,等等)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top