【发布时间】:2010-11-27 16:24:18
【问题描述】:
我喜欢 Emacs ESS 组合。我喜欢在不使用鼠标的情况下将代码行、函数、区域和缓冲区发送到命令行进行评估。
但是,我注意到 Emacs 中的 Eval Function 命令比简单地运行 source("fns.R") 慢得多,其中 fns.R 是包含我要评估的函数的文件。
为什么会这样?
【问题讨论】:
-
出于好奇,它慢了多少?
我喜欢 Emacs ESS 组合。我喜欢在不使用鼠标的情况下将代码行、函数、区域和缓冲区发送到命令行进行评估。
但是,我注意到 Emacs 中的 Eval Function 命令比简单地运行 source("fns.R") 慢得多,其中 fns.R 是包含我要评估的函数的文件。
为什么会这样?
【问题讨论】:
我只是猜测,但当你说时
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")' 的好处是您从一个清晰的工作区开始(尽管您应该小心您的 .除非您在 'myscript.r' 中显式调用 'source("~/.Rscript")',否则不会加载 Rprofile,因此您可以确保您的脚本是自包含的(它调用正确的库,您的词法范围函数没有引用您忘记删除的全局空间中的意外变量,等等)。
【讨论】:
我认为ess list 的人们可以为您提供更好的答案。但是,如果您进行无形评估,则处理速度要快得多。尝试将其放入您的 .emacs 文件中:
(setq ess-eval-visibly-p nil)
【讨论】: