繁体   English   中英

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

[英]Structuring a Statistical Analysis with R Using Emacs/ESS

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

我想在文件中引入某种子标题/部分标题(聚合,聚类分析,模拟等),并在其下编写代码,因此我可以快速跳转至我要处理的部分。

我想我只能使用注释并进行搜索,但是我无法以这种方式获得概述或索引。 我还考虑过将Org-Mode用于标题,但是对于与其他编辑器一起工作的协作者来说,这并不是很方便。

我知道R-Studio通过部分实现了这一点,因此将为emacs提供解决方案,对吗?

非常感谢你!

PS:类似imenu的东西会起作用,但这仅用于函数,不适用于部分

通常,我使用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”。 任何带有#####注释都将格式化为“标头2”, ##### 。以###开头的###被视为带有特殊字体锁的注释(用于长注释)。

这可以给这样的事情:

在此处输入图片说明

这是很棘手的,但是优点是它仅使用标准的R注释,因此可以与他人共享而不会出现问题。 通常,我将以下内容用作“标头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年2月)对Orgmode的添加意味着您现在应该能够在源代码中嵌入组织标题,然后使用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:

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

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

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

而且,将内容分解为单独的文件以进行采购有点次优-更好地编写函数并将其放在程序包中-并使用devtools程序包使工作起来非常简单。 只需编辑.R文件并load_all更新(复杂的软件包构建都没有过去的时光)。

大赢家。

polymode提供R + markdown,R + brew,R + cpp等内容。 它仍处于开发的早期阶段,似乎只能在最新的emacs(24.3)上可靠地工作。

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

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

## Local variables:
## allout-layout: (-1 : 0)
## End:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM