学习 Emacs Speaks Statistics(使用 R)有哪些好的参考/建议?

机器算法验证 r 软件
2022-03-16 13:29:36

我使用 R 已经好几年了,但我一直在使用像 Tinn-R、JGR 和最近的 R-Studio 这样的 GUI。

虽然我喜欢 R-Studio 的界面,但我觉得对于很少/没有图形的较长程序,我可以利用 Emacs 等更基本的文本编辑器提供的快捷方式更有效地编码。

我安装了 Emacs 和 ESS 插件,一切正常,我测试了一些代码,但我很难习惯它,而且我还没有找到合适的参考手册。

谷歌搜索返回了一些非常过时的网站,其教程主要侧重于安装和配置插件,官方网站上的手册对我来说有点太密集了。

我正在寻找一个相对简短的介绍(最好带有屏幕截图和热键列表),专为熟悉 R 但不熟悉 Emacs 的人设计。

任何有关入门的参考资料或其他提示将不胜感激。

2个回答

首先,您需要学习使用 emacs 操作的基本文本。由于 emacs 非常复杂,因此找出如何简单地选择文本和复制可能是一个挑战。因此,花一些时间来找出如何有效地做到这一点。阅读手册可能会有所帮助。对于 Mac OS X 使用 Aquamacs,它支持原生快捷方式。

使用 ESS 与使用 R 没有区别。应该适用相同的代码组织规则。在我的例子中,每个项目都有自己的目录,它位于名为 R 的父目录中,它位于我的主目录中(对于 Windows,我建议将 emacs 主目录指向所有源代码所在的目录)。因此,当我使用 ESS 处理项目时,我总是这样做M-x R并选择我的项目目录的起始目录。

启动 R 进程后,我通常将 emacs 分为两个窗口(emacs 术语)。然后在左边我有一个源代码,我将它发送到右边的 R 进程。相关的快捷方式(这些是 emacs 快捷方式)C-x 3用于垂直拆分窗口、C-x 1使当前缓冲区成为唯一窗口以及C-x 2水平拆分窗口。

在向 R 发送代码时,我会区分函数和 R 语句。为此,我将所有函数保存在一个通常称为10code.R. 然后我可以使用加载 ESS 文件选项(快捷方式C-c C-l)简单地加载此文件。这种方法的优点是它获取所有函数并且在 R 缓冲区中不产生任何内容。如果您的代码中有错误,那么 ESS 会在 minibuffer 中显示一条消息,您可以通过按C-c` 进行调查。

另一个代码是 R 语句,我尽量保持不言自明:加载数据、清理数据、拟合统计模型、检查结果、生成最终结果。这些语句的源代码是项目的当前状态。目的是在项目完成后,使用此代码获取文件,重现项目(我也使用 git 来跟踪历史记录)。在处理这个文件时,我通常只使用一个 R 语句,我通过 eval 函数、段落、语句命令将其发送到 R 进程,快捷方式是C-c C-c. 该命令将段落发送给 R 处理,即由换行符分隔的文本。这很方便,因为您可以将 R 语句分组到任务中,并将整个任务发送到 R 进程。它也不需要选择文本,这也很方便。捷径C-c C-c优点是将光标移动到 R 窗口,因此您可以立即检查发送的 R 语句的结果。

所以我的基本工作流程在窗口和缓冲区之间移动了很多。为方便起见,我在 .emacs 文件中使用了以下快捷方式:

(define-key global-map [f1] 'Control-X-prefix)
(define-key global-map [f3] 'find-file)
(define-key global-map [f2] 'save-buffer)
(define-key global-map [f8] 'kill-buffer)
(define-key global-map [f5] 'switch-to-buffer)
(define-key global-map [f6] 'other-window)
(define-key global-map [f9] 'ess-load-file)

我很少使用f1,但其他所有的都非常频繁。我使用的其他特定 ESS 设置如下:

(setq comint-input-ring-size 1000)
(setq ess-indent-level 4)
(setq ess-arg-function-offset 4)
(setq ess-else-offset 4)

这告诉 ESS 将制表符设为 4 个字符宽(默认为 2 个),这是我个人的偏好,并扩展了 ESS 保存为历史记录的您发出的命令的数量。

对于直接使用 R 进程,我发现以下快捷方式非常有用:

(add-hook 'inferior-ess-mode-hook 
      '(lambda nil 
         (define-key inferior-ess-mode-map [\C-up] 'comint-previous-matching-input-from-input)
             (define-key inferior-ess-mode-map [\C-down] 'comint-next-matching-input-from-input)
        (define-key inferior-ess-mode-map [\C-x \t] 'comint-dynamic-complete-filename)
        )
)

这会从您的 R 语句历史记录中调用 R 语句,但它会尝试将其与您的行中已经存在的语句相匹配。因此,例如输入plR 进程并按下\C-up(即控制和向上箭头)将循环浏览所有以 开头的语句pl,因此将调用例如所有plot(...命令。

我与 ESS 一起使用的最终设置如下:

(setq ess-ask-about-transfile t)

这样,ESS 总是询问将文本保存在 R 进程的缓冲区中的哪个位置。我通常根据日期对这些文件进行编号,所以我总是有另一种方法来跟踪我到底在做什么。此选项的唯一警告是,出于某种原因,ESS 在加载 R 后将 R 缓冲区设置为只读。使缓冲区可写的快捷方式是C-x C-q.

因此,这些是我用于与 ESS 合作的设置,我对它们感到满意,而且几年来我觉得不需要添加任何东西。在向初次使用 ESS 的用户介绍 ESS 时,我通常会给出这个概述。

我将以最后一个快捷方式结束,这对我来说是使用 Emacs 时最常用的快捷方式,尤其是使用 ESS 时,C-g它会退出迷你缓冲区中的命令。在我使用 Emacs 和 ESS 的这些年里,我仍然设法调用了一些我不想要的 Emacs 命令,C-g在这些情况下非常有帮助。

取决于你在哪里,这可能对你不起作用,但我在大厅里发现有人使用它并用问题纠缠他们。坚持下去,值得!

我发现一个特别有用的技巧是使用 cua-mode。它使 emacs 与现代程序共享一些最常见的键盘快捷键(如保存、剪切、复制等)。我还发现矩形模式在 cua 模式下更容易使用。