Emacs ESS:Eval region与source()的区别

5

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

然而,我注意到Emacs中的Eval Function命令比简单运行source("fns.R")要慢得多,其中fns.R是包含我想要评估的函数的文件。

为什么会这样呢?


1
出于好奇,它慢了多少? - Daniel Kessler
3个回答

8

我认为在ess列表中的人会给你更好的答案。但是如果你进行隐式评估,处理速度会快得多。尝试将以下内容放入您的.emacs文件中:

(setq ess-eval-visibly-p nil)

4
我只是猜测,当你输入 source("fns.R") 时,并没有涉及到 Emacs/ESS,计算时间只是 R 读取并解析文件的时间,这可能非常短。而 Eval Function 则会将区域传递给 Emacs 解释器,后者需要将其逐行发送到 R 引擎中,然后以分块方式进行解析,因此第二种方法会更慢。
尽管如此,在整个过程中,谁在乎这点时间呢?我经常发送整个缓冲区或大型区域,这可能需要花费大部分时间。正如你所说,我仍然认为(丰富的)编辑器和底层语言之间的交互能力是非常强大的。
向 Emacs 开发人员和 ESS 团队致敬!

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,并使用上述技巧。

你也可以使用

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

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


3
可以这样做,或者你可以直接使用 Ctrl-c Ctrl-l。 - Eduardo Leoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接