2013-02-18 3 views
13

Я ищу способ структурирования своего статистического анализа. В настоящее время я использую Emacs/ESS, и файл анализа получился довольно длинным. Я начал вставлять части кода в исходные функции в отдельный файл, но все же ...Структурирование статистического анализа с использованием R Использование Emacs/ESS

Я хотел бы представить какие-то подзаголовки/заголовки разделов в файле (Агрегация, Кластер-анализ, Моделирование, ...) и напишите код под ним, чтобы я мог быстро перейти к разделам, над которыми я хочу работать.

Я думаю, я мог просто использовать комментарии и искать их, но я не мог получить обзор или индекс таким образом. Я также думал об использовании Org-Mode для заголовков, но это было бы не очень удобно для коллаборационистов, которые работают с другим редактором.

Я знаю, что R-Studio реализует это с помощью разделов, так что будет решение для emacs, не так ли?

спасибо!

PS: что-то вроде imenu будет работать, но это только для функций, а не для секций

ответ

11

Недавние (февраль 2013 г.) дополнения к Orgmode означают, что теперь вы можете вставлять заголовки org в свой исходный код, а затем перемещаться по ним с помощью orgstruct-mode. Итак, обновите свой режим org через git, а затем попробуйте открыть следующий пример 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: 
+0

Хм - попробовал, но ничего не происходит Версия: Org-mode version 7.9.3e (7.9 .3e-1123-g33d362 @ /home/rkrug/.emacs.d/org-mode/lisp/). Должен ли я спрашивать о списке рассылки org? – Rainer

+0

Это работает для меня для изложения, и это очень удобно, но заголовки не отображаются с определенным лицом. Знаете ли вы, есть ли возможность сделать это? – juba

+0

Я не видел ничего встроенного в orgstruct, который будет выполнять дополнительную блокировку шрифтов, но другой пример здесь с блокировкой шрифтов можно было бы адаптировать чтобы выделить заголовки. –

15

В общем я использую орг-режим и орг-столпотворение, но когда я должен делиться сценариями с другими, я «ве получил следующее в моем .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» и т. Д. И строки, начинающиеся с ###, рассматриваются как комментарий со специальной блокировкой шрифта (используется для длинных комментариев).

Это может дать что-то вроде этого:

enter image description here

Это вполне 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, так что должен быть лучшими способами сделать это, и не удивляйтесь в случае ошибок!

+0

Мне потребовалось время, чтобы попробовать ваше предложение. Но я недавно это сделал, и блокировка шрифтов работает. Но я использую темную тему («zenburn») для emacs, а шрифты с закрытыми заголовками теперь имеют белый фон, что немного сложно на глаза. От взгляда на ваш скриншот кажется, что вы как-то исправили эту проблему. –

+0

Мне удалось изменить фон hideface на цвет, соответствующий моей теме. Теперь я хочу изменить ключевые слова #### на ### *, ##### на ### ** и ###### на ### ***, так что я могу использовать orgstruct- режим легко. Любая помощь с регулярными выражениями? Я пробовал что-то по этим строкам: '(("^ ### \\ (* \\) \\ ([^ #]. * \\) $" (1' ess-jb-hide-face t) (2 'ess-jb-h1-face t)) –

+0

@ stats-hb Может быть, что-то вроде этого? (Не тестировалось): ''^### \\ (\\ * \\) \\ ([^ *]. * \\) $ "' – juba

8

Похоже, у вас есть один большой сценарий анализа. Это не очень оптимально ...

Подумайте о том, чтобы переделать его с помощью RMarkdown или Sweave и использовать knitr для запуска. Затем вы можете использовать инструменты emacs для навигации по методу уценки или TeX, и вы можете использовать систему кэширования в knitr, чтобы сохранить необходимость делать анализы с самого начала, когда вы что-то изменили ближе к концу.

Вы также получите отформатированный отчет из анализа, если хотите.

Кроме того, разбиение материалов на отдельные файлы для источников является немного неоптимальным - гораздо лучше писать функции и помещать их в пакет - и использовать пакет devtools, чтобы сделать работу с ним очень простой. Просто отредактируйте свои .R-файлы, и load_all обновит его (ни один из сложнейших пакетов, созданных в прошлом).

Большой выигрыш.

+0

Одна из проблем с использованием Rmarkdown заключается в том, что она действительно не поддерживается в Emacs/ESS. –

3

polymode обеспечивает R + уценки, R + варево, R + СРР и другие вещи. Он все еще находится на ранней стадии разработки и, похоже, работает надежно только на очень недавних emacs (24.3).

0

Другой вариант, которым я был доволен с годами, - это режим allout. Использование каждого файла локальные переменные:

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

Аналогично orgstruct режим упомянутого выше вы можете также использовать новый outshine package, который работает вместе с контурной-минорной режиме интерпретировать комментарии звездочек как орг-режим, как рубрики , Они могут складываться/расширяться/добавляться/и т.д., используя простые ярлыки, такие как TAB и т. Д.

Смежные вопросы