使用Emacs/ESS用R构建统计分析

sta*_*-hb 13 emacs statistics r ess

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

我想在文件中引入一些子标题/节标题(聚合,聚类分析,模拟,...)并在其下面编写代码,这样我就可以快速跳转到我想要处理的部分.

我想我可以使用评论并搜索它们,但我无法获得概述或索引.我还考虑过使用Org-Mode作为头条新闻,但对于与另一位编辑合作的合作者来说,这不是很方便.

我知道R-Studio通过各个部分实现了这一点,因此会有针对emacs的解决方案,对吧?

非常感谢你!

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

jub*_*uba 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))
     ))
Run Code Online (Sandbox Code Playgroud)

这样,####在行开头的任何注释都被格式化为"标题1".任何注释都#####被格式化为"标题2"等.并且以开头的行### 被视为带有特殊字体锁的注释(用于长注释).

这可以给出这样的东西:

在此输入图像描述

这是非常hacky,但优点是它只使用标准R注释,因此可以与其他人共享而没有问题.一般来说,我使用以下"头1":其他人看到如下,而我喜欢我定义的字体锁:

############################################
#### HEADER 1
############################################
Run Code Online (Sandbox Code Playgroud)

使用此语法,您还可以使用以下内容激活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)))))
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*len 11

最近(2013年2月)对Orgmode的补充意味着您现在应该能够在源代码中嵌入org标题,然后使用orgstruct-mode导航它们.因此,通过git升级您的组织模式,然后尝试打开以下示例R文件.如果您在嵌入了组织标题的注释行中,只需按TAB或shift-TAB,您就应该获得组织模式标题.

### * 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:
Run Code Online (Sandbox Code Playgroud)


Spa*_*man 8

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

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

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

此外,将内容分解为单独的文件以进行采购有点次优 - 远远好于编写函数并将它们放入包中 - 并且使用devtools包来使其工作非常简单.只需编辑你的.R文件并对其进行load_all更新(没有复杂的包构建过去的时间).

大winnage.