Структурирование статистического анализа с использованием R Использование Emacs/ESS
Я ищу способ структурирования своего статистического анализа. В настоящее время я использую Emacs/ESS, и файл анализа получился довольно длинным. Я начал поместить части кода в исходные функции в отдельный файл, но все же...
Я хотел бы ввести какие-то подзаголовки/заголовки разделов в файле (Агрегация, Кластер-анализ, Моделирование,...) и написать код под ним, чтобы я мог быстро перейти к разделам, которые я хочу работа над.
Думаю, я мог просто использовать комментарии и искать их, но я не мог получить обзор или индекс таким образом. Я также думал об использовании Org-Mode для заголовков, но это было бы не очень удобно для коллаборационистов, которые работают с другим редактором.
Я знаю, что R-Studio реализует это с помощью разделов, поэтому будет решение для emacs, правильно?
Большое спасибо!
PS: что-то вроде imenu будет работать, но это просто для функций, а не для разделов
Ответы
Ответ 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: