2013-02-18 13 views
13

Poszukuję sposobu na uporządkowanie mojej analizy statystycznej. Obecnie używam Emacs/ESS i plik analizy okazał się dość długi. Zacząłem umieszczać fragmenty kodu w źródłowych funkcjach w osobnym pliku, ale nadal ...Konstruowanie analizy statystycznej za pomocą R przy użyciu Emacsa/ESS

Chciałbym wprowadzić w tekście jakieś tytuły/tytuły sekcji (Agregacja, Analiza skupień, Symulacje, ...) i napisać kod pod nim, więc mogłem szybko przejść do sekcji, nad którymi chcę pracować.

Sądzę, że mogłem po prostu użyć komentarzy i wyszukać je, ale nie mogłem uzyskać w ten sposób przeglądu lub indeksu. Myślałem także o używaniu trybu Org do Nagłówek, ale to nie byłoby zbyt wygodne dla współpracowników, którzy pracują z innym edytorem.

Wiem, że R-Studio implementuje to z sekcjami, więc będzie rozwiązanie dla emacs, prawda?

Dziękuję bardzo!

PS: coś imenu będzie działać, ale to tylko dla funkcji, nie dla sekcjach

Odpowiedz

11

Ostatnie (luty 2013 r.) Dodatki do Orgmode oznaczają, że powinieneś teraz móc umieszczać nagłówki org w kodzie źródłowym, a następnie nawigować po nich przy użyciu trybu orgstruct. Tak więc, uaktualnij swój tryb org poprzez git, a następnie spróbuj otworzyć poniższy przykład pliku R. Kiedy znajdujesz się w wierszu komentarza z nagłówkiem org, po prostu naciśnij TAB lub shift-TAB, a otrzymasz nagłówki w trybie org.

### * 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

Hm - po prostu wypróbowałem, ale nic się nie dzieje? Wersja: Wersja 7g w trybie Org 7.9.3e (7.9 .3e-1123-g33d362 @ /home/rkrug/.emacs.d/org-mode/lisp/). Czy powinienem zapytać o listę mailingową? – Rainer

+0

To działa dla mnie, ponieważ jest to bardzo przydatne, ale nagłówki nie są wyświetlane z konkretną twarzą Czy wiesz, czy istnieje opcja to zrobić? – juba

+0

Nie widziałem niczego wbudowanego w strukturę, która będzie robiła dodatkowe blokowanie czcionek, ale inny przykład tutaj z blokadą czcionki może być dostosowany podświetlić nagłówki. –

15

Generalnie używam org-mode i org-babel, ale kiedy mam dzielić skryptów z innych, „ve got następujących w moim .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)) 
    )) 

Dzięki temu każdy komentarz z #### na początku linii jest sformatowana jako«nagłówek 1». Każdy komentarz z numerem ##### jest sformatowany jako "nagłówek 2" itd. Wiersze rozpoczynające się od ### są postrzegane jako komentarz ze specjalną blokadą czcionki (używaną do długich komentarzy).

To może dać coś takiego:

enter image description here

Jest to dość hacky, ale zaletą jest to, że używa tylko standardowych komentarzy R i jako taki z innymi mogą być udostępniane bez problemu. W ogóle używać następujących dla „nagłówek 1”: inni widzą go jako poniżej, a ja lubię swoją określoną font-Lock:

############################################ 
#### HEADER 1 
############################################ 

Z tej składni, można również korzystać z następujących czynności, aby aktywować outline-minor-mode na odcinkach zdefiniowane wcześniej i być w stanie złożyć/rozłożyć je:

(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))))) 

Wszystko to kod nie został bardzo dobrze przetestowane, a ja jestem daleko od eksperta w emacs Lisp, więc nie powinno być lepsze sposoby, aby to zrobić, i nie zdziw się w przypadku błędów!

+0

Zajęło mi trochę czasu, aby spróbować Twojej sugestii. Ale ostatnio zrobiłem i blokowanie czcionek działa. Ale używam ciemnego motywu ("zenburn") dla emacs, a nagłówki z zamkniętymi czcionkami mają teraz białe tło, które jest trochę trudne dla oczu. Od spojrzenia na zrzut ekranu wydaje się, że jakoś udało się rozwiązać ten problem. –

+0

Udało mi się zmienić tło ukrywania na kolor pasujący do mojego motywu. Teraz chcę edytować Słowa kluczowe #### na ### *, ##### na ### ** i ##### na ### ***, dzięki czemu mogę używać struktur tryb łatwo. Jakąkolwiek pomoc dotyczącą wyrażeń regularnych? Próbowałem coś wzdłuż tych linii: '((^^### \\ (* \\) \\ ([^ #]. * \\) $ "(1' ess-jb-hide-face t) (2 'ess-jb-h1-face t)) –

+0

@ stats-hb Może coś w tym stylu (nie testowane): '"^### \\ (\\ * \\) \\ ([^ *]. * \\) $ "' – juba

8

Wygląda na to, że masz jeden duży skrypt analityczny. To nie jest zbyt optymalne ...

Pomyśl o powtórzeniu go za pomocą RMarkdown lub Sweave, i użyj knitr, aby go uruchomić. Następnie możesz użyć narzędzi emacsa do nawigacji w Markdown lub TeX-a i możesz użyć systemu buforowania w knitr, aby oszczędzić konieczności wykonywania analiz od samego początku, kiedy zmienisz coś w pobliżu końca.

Otrzymujesz również sformatowany raport z analizy, jeśli chcesz.

Również rozdzielanie plików na osobne pliki jest nieco mniej optymalne - o wiele lepiej jest pisać funkcje i umieszczać je w pakiecie - i używać pakietu devtools, aby praca z nim była naprawdę prosta. Po prostu zmodyfikuj swoje pliki .R i zaktualizuj je (nie ma skomplikowanej kompilacji pakietów z przeszłości).

Wielka wygrana.

+0

Jednym z problemów z używaniem Rmarkdown jest to, że nie jest (jeszcze) naprawdę wspierany w Emacs/ESS. –

3

polymode zapewnia markdown + R, R +, R + naparu CPP i inne rzeczy. Wciąż jest na wczesnym etapie rozwoju i wydaje się działać niezawodnie tylko na bardzo niedawnych emacach (24.3).

0

Inną opcją, z której byłem zadowolony przez te wszystkie lata, jest tryb allout. Korzystanie zmienne lokalne per-file:

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

Podobnie jak orgstruct trybie, o którym mowa powyżej, mogą również korzystać z nowej outshine package który współpracuje z konspektu-moll trybie interpretować komentarze gwiazdkami jak pozycjach org-mode-like . Można je złożyć/rozwinąć/dodać/itp. Za pomocą prostych skrótów, takich jak TAB, itp.

Powiązane problemy