Подтвердить что ты не робот

Структурирование статистического анализа с использованием R Использование Emacs/ESS

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

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

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

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

Большое спасибо!

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

enter image description here

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

Ответ 3

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

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

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

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

Большая выигрышная игра.

Ответ 4

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

Ответ 5

Аналогично описанному выше режиму orgstruct вы также можете использовать новый

Ответ 6

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

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