14

我正在寻找一种构建统计分析的方法。我目前使用 Emacs/ESS 并且分析文件变得很长。我已经开始将部分代码放入单独文件中的可源函数中,但仍然......

我想在文件中引入某种副标题/部分标题(聚合、聚类分析、模拟……)并在其下方编写代码,这样我就可以快速跳转到我想要处理的部分。

我想我可以只使用评论并搜索它们,但我无法以这种方式获得概述或索引。我还考虑过为标题使用 Org-Mode,但这对于与其他编辑器一起工作的合作者来说不是很方便。

我知道 R-Studio 用部分实现了这一点,所以会有一个针对 emacs 的解决方案,对吧?

非常感谢你!

PS:像 imenu 这样的东西会起作用,但这只是用于功能,而不是用于部分

4

6 回答 6

15

一般来说,我使用 org-mode 和 org-babel,但是当我必须与他人共享脚本时,我的.emacs:

(defgroup ess-jb-faces nil
  "Faces used by cutomized ess-mode"
  :group 'faces)

(defface ess-jb-comment-face
  '((t (:background "cornsilk" 
    :foreground "DimGrey"
    :inherit font-lock-comment-face)))
  "Face used to highlight comments."
  :group 'ess-jb-faces)

(defface ess-jb-comment-bold-face
  '((t (:weight bold
    :inherit ess-jb-comment-face)))
  "Face used to highlight bold in comments."
  :group 'ess-jb-faces)

(defface ess-jb-h1-face
  '((t (:height 1.6 
    :weight bold 
    :foreground "MediumBlue"
    :inherit ess-jb-comment-face)))
  "Face used to highlight h1 headers."
  :group 'ess-jb-faces)

(defface ess-jb-h2-face
  '((t (:height 1.2 
    :weight bold 
    :foreground "DarkViolet"
    :inherit ess-jb-comment-face)))
  "Face used to highlight h2 headers."
  :group 'ess-jb-faces)

(defface ess-jb-h3-face
  '((t (:height 1.0 
    :weight bold 
    :foreground "DarkViolet"
    :inherit ess-jb-comment-face)))
  "Face used to highlight h3 headers."
  :group 'ess-jb-faces)

(defface ess-jb-hide-face
  '((t (:foreground "white"
    :background "white"
    :inherit ess-jb-comment-face)))
  "Face used to hide characters."
  :group 'ess-jb-faces)

(font-lock-add-keywords 'ess-mode
   '(("^###\\(#\\)\\([^#].*\\)$" (1 'ess-jb-hide-face t)(2 'ess-jb-h1-face t))
     ("^###\\(##\\)\\([^#].*\\)$" (1 'ess-jb-hide-face t)(2 'ess-jb-h2-face t))
     ("^###\\(###\\)\\([^#].*\\)$" (1 'ess-jb-hide-face t)(2 'ess-jb-h3-face t))
     ("^###\\( .*\\|$\\)" 1 'ess-jb-comment-face t)
     ("^###" "\\*.*?\\*" nil nil (0 'ess-jb-comment-bold-face append))
     ))

这样,行首的任何注释####都被格式化为“标题 1”。任何带有的注释#####都被格式化为“header 2”等。以开头的行### 被视为带有特殊字体锁定的注释(用于长注释)。

这可以给出这样的结果:

在此处输入图像描述

这很 hacky,但优点是它只使用标准的 R 注释,因此可以毫无问题地与他人共享。一般来说,我对“header 1”使用以下内容:其他人看到它如下,而我喜欢我定义的 font-lock :

############################################
#### HEADER 1
############################################

使用此语法,您还可以使用以下命令激活outline-minor-mode 先前定义的部分并能够折叠/展开它们:

(add-hook 'ess-mode-hook
      '(lambda ()
         (auto-complete-mode nil)
         (outline-minor-mode 1)
         (setq outline-regexp "\\(^#\\{4,6\\}\\)\\|\\(^[a-zA-Z0-9_\.]+ ?<- ?function(.*{\\)")
         (setq outline-heading-alist
           '(("####" . 1) ("#####" . 2) ("######" . 3)
             ("^[a-zA-Z0-9_\.]+ ?<- ?function(.*{" .4)))))

所有这些代码都没有经过很好的测试,而且我远不是 emacs lisp 方面的专家,所以应该有更好的方法来做到这一点,万一出现错误也不要感到惊讶!

于 2013-02-18T17:13:27.050 回答
11

最近(2013 年 2 月)添加到 Orgmode 意味着您现在应该能够在源代码中嵌入 org 标题,然后使用 orgstruct-mode 浏览它们。因此,通过 git 升级您的 org 模式,然后尝试打开以下示例 R 文件。当您在嵌入了 org 标题的注释行上时,只需按 TAB 或 shift-TAB,您应该会得到 org-mode 标题。

### * Create data
data = list( s1=list(x=1:3, y=3:1), 
     s2=list(x=1:5, y=1:5), s3=list(x=1:4, y=rep(3,4)))

### * Base graphics version


par(mfrow=c(2,2))
lapply(data, plot)

### * Lattice version

nplots <- length(data)
pts.per.plot <- sapply(data, function(l) length(l$x))
df <- data.frame(which=rep(1:nplots, times=pts.per.plot),
                 x=unlist(sapply(data, function(l) l$x)),
                 y=unlist(sapply(data, function(l) l$y)))

xyplot(y~x|which, data=df, layout=c(2,2))

### ** Make the pdf
pdf(file='o.pdf')
xyplot(y~x|which, data=df, layout=c(2,1))                 
dev.off()

### * End of file

### Local Variables:
### eval: (orgstruct-mode 1)
### orgstruct-heading-prefix-regexp: "### "
### End:
于 2013-02-19T10:27:18.403 回答
8

听起来你有一个大的分析脚本。这不是很理想...

考虑使用 RMarkdown 或 Sweave 重做它,并使用knitr它来运行它。然后,您可以使用 emacs 的工具来导航 markdown 或 TeX,并且您可以使用缓存系统在knitr您在接近尾声时更改某些内容时不必从一开始就进行分析。

如果需要,您还可以从分析中获得格式化的报告。

此外,将东西分成单独的文件进行采购有点次优 - 编写函数并将它们放在一个包中要好得多 - 并且使用devtools包来使其工作变得非常简单。只需编辑您的 .R 文件并load_all对其进行更新(没有一个复杂的包构建过去的东西)。

大胜算。

于 2013-02-18T17:18:08.390 回答
3

polymode提供 R+markdown、R+brew、R+cpp 和其他东西。它仍处于早期开发阶段,似乎只能在最近的 emacs (24.3) 上可靠地工作。

于 2013-03-27T19:03:16.590 回答
1

与上面提到的 orgstruct-mode 类似,您还可以使用新的outshine 包,它与 outline-minor-mode 一起使用,将带有星号的注释解释为类似 org-mode 的标题。它们可以使用简单的快捷键(如 TAB 等)折叠/展开/添加/等。

于 2013-05-13T19:11:56.483 回答
0

多年来我一直很满意的另一种选择是 allout-mode。使用每个文件的局部变量:

## Local variables:
## allout-layout: (-1 : 0)
## End:
于 2013-04-16T03:06:19.727 回答