我正在寻找一种方法来构建我的统计分析。我目前使用的是Emacs / ESS,分析文件很长。我已经开始将部分代码放入一个单独的文件中的可源函数中,但仍然......
我想在文件中引入一些子标题/节标题(聚合,聚类分析,模拟,...)并在其下面编写代码,这样我就可以快速跳转到我想要的部分从事于。
我想我可以使用评论并搜索它们,但我无法获得概述或索引。我还考虑过使用Org-Mode作为头条新闻,但对于与其他编辑合作的合作者来说,这不会很方便。
我知道R-Studio通过各个部分实现了这一点,因此会有针对emacs的解决方案,对吧?
非常感谢!
PS:像imenu这样的东西会起作用,但这只适用于功能,而不适用于部分答案 0 :(得分: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”。对#####
的任何评论都被格式化为“标题2”等。以###
开头的行被视为带有特殊字体锁定的注释(用于长注释)。
这可以是这样的:
这非常hacky,但优点是它只使用标准R注释,因此可以与其他人共享而没有问题。一般情况下,我使用以下内容作为“标题1”:其他人在下面看到它,而我喜欢我定义的字体锁:
############################################
#### 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的专家,所以应该有更好的方法来做到这一点,并且在出现错误时不要感到惊讶!
答案 1 :(得分: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:
答案 2 :(得分:8)
听起来你有一个很大的分析脚本。那不是很理想......
考虑使用RMarkdown或Sweave重做它,并使用knitr
来运行它。然后,您可以使用emacs的工具来导航markdown或TeX,您可以使用knitr
中的缓存系统,以便在您接近结束时更改某些内容时从一开始就不必进行分析。
如果需要,您还可以从分析中获得格式化的报告。
另外,将内容分解为单独的文件以获取源代码有点次优 - 远远好于编写函数并将它们放入包中 - 并且使用devtools
包来使其工作非常简单。只需编辑您的.R文件并load_all
更新它(没有复杂的包构建过去的时间)。
大赢家。
答案 3 :(得分:3)
polymode提供R +降价,R + brew,R + cpp等内容。它仍处于开发的早期阶段,似乎只能在最近的emacs(24.3)上可靠地工作。
答案 4 :(得分:1)
与上面提到的orgstruct-mode类似,您也可以使用与outline-minor-mode一起使用的新outshine package来将带有星号的注释解释为类似org-mode的标题。它们可以使用像TAB等简单的快捷方式折叠/扩展/添加/等。
答案 5 :(得分:0)
多年来我一直很满意的另一个选择是allout-mode。使用每个文件的局部变量:
## Local variables:
## allout-layout: (-1 : 0)
## End: