Najpierw musisz nauczyć się podstawowego tekstu posługującego się emacsem. Ponieważ emacs jest bardzo wyrafinowany, znalezienie prostego wyboru tekstu i kopiowania może być wyzwaniem. Dlatego poświęć trochę czasu, aby dowiedzieć się, jak to zrobić skutecznie. Przeczytanie instrukcji może pomóc. W systemie Mac OS X używa Aquamacs, obsługuje natywne skróty.
Praca z ESS nie różni się od pracy z R. Te same zasady dotyczące organizacji kodu powinny mieć zastosowanie. W moim przypadku każdy projekt ma swój własny katalog, który znajduje się w katalogu nadrzędnym o nazwie R, który znajduje się w moim katalogu domowym (w systemie Windows zalecam skierowanie katalogu domowego emacs do katalogu, w którym znajduje się całe źródło). Tak więc, kiedy używam ESS do pracy nad projektem, zawsze robię M-x R
i wybieram katalog początkowy mojego katalogu projektu.
Po uruchomieniu procesu R zwykle dzielę emacsa na dwa okna (terminologia emacs). Następnie po lewej mam kod źródłowy, który wysyłam do procesu R po prawej. Odpowiednie skróty (są to skróty emacsa) służą C-x 3
do podziału okien w pionie, C-x 1
do uczynienia bieżącego bufora jedynym oknem i C-x 2
do podziału okien w poziomie.
Wysyłając kod do R, zachowuję rozróżnienie między funkcjami a instrukcjami R. Robię to, przechowując wszystkie moje funkcje w jednym pliku, zwykle nazywanym 10code.R
. Następnie mogę po prostu załadować ten plik za pomocą opcji ładowania pliku ESS (skrót C-c C-l
). Zaletą tego podejścia jest to, że źródło wszystkich funkcji i nie produkuje nic w buforze R. Jeśli w kodzie wystąpił błąd, ESS wyświetla komunikat w minibuforze i można go zbadać, naciskając C-c
`.
Drugi kod to instrukcje R, które staram się zachować w sposób oczywisty: ładuj dane, czyść dane, dopasowuj model statystyczny, sprawdzaj wyniki, twórz ostateczne wyniki. Kodem źródłowym tych instrukcji jest bieżący status projektu. Intencją jest, aby po zakończeniu projektu, pobieranie plików z tym kodem, reprodukowało projekt (używam również git do śledzenia historii). Podczas pracy z tym plikiem zwykle pracuję tylko z jedną instrukcją R, którą wysyłam do procesu R za pomocą funkcji eval, akapit, polecenie instrukcji, którym jest skrót C-c C-c
. To polecenie wysyła do R przetworzenie akapitu, tzn. Tekstu, który jest oddzielony nowymi wierszami. Jest to przydatne, ponieważ można grupować instrukcje R w zadania i wysyłać całe zadanie do procesu R. Nie wymaga również zaznaczania tekstu, co jest również bardzo wygodne. SkrótC-c C-c
ma tę zaletę, że przesuwa kursor do okna R, dzięki czemu można natychmiast sprawdzić wyniki wysłanej instrukcji R.
Więc mój podstawowy przepływ pracy dużo się przemieszcza między oknami i buforami. Aby to ułatwić, w pliku .emacs używam następujących skrótów:
(define-key global-map [f1] 'Control-X-prefix)
(define-key global-map [f3] 'find-file)
(define-key global-map [f2] 'save-buffer)
(define-key global-map [f8] 'kill-buffer)
(define-key global-map [f5] 'switch-to-buffer)
(define-key global-map [f6] 'other-window)
(define-key global-map [f9] 'ess-load-file)
Rzadko używam f1
, ale wszystkie pozostałe bardzo często. Inne specyficzne ustawienia ESS, których używam, to:
(setq comint-input-ring-size 1000)
(setq ess-indent-level 4)
(setq ess-arg-function-offset 4)
(setq ess-else-offset 4)
Mówi to ESS, aby tabulator miał szerokość 4 znaków (domyślnie jest to 2), co jest moją osobistą preferencją, i zwiększa liczbę wydanych poleceń zapisywanych przez ESS jako historię.
Do bezpośredniej pracy z procesem R bardzo przydatne okazały się następujące skróty:
(add-hook 'inferior-ess-mode-hook
'(lambda nil
(define-key inferior-ess-mode-map [\C-up] 'comint-previous-matching-input-from-input)
(define-key inferior-ess-mode-map [\C-down] 'comint-next-matching-input-from-input)
(define-key inferior-ess-mode-map [\C-x \t] 'comint-dynamic-complete-filename)
)
)
To przywołuje instrukcję R z historii instrukcji R, ale próbuje dopasować ją do tej, która jest już w twojej linii. Na przykład wpisanie pl
w procesie R i naciśnięcie \C-up
(to kontrola i strzałka w górę) spowoduje przejście przez wszystkie instrukcje, które zaczynają się od pl
, więc przywołają na przykład wszystkie plot(...
polecenia.
Ostateczne ustawienie, którego używam z ESS, jest następujące:
(setq ess-ask-about-transfile t)
W ten sposób ESS zawsze pyta, gdzie zapisać tekst w buforze z procesem R. Zazwyczaj numeruję te pliki według daty, więc zawsze mam inny sposób na śledzenie tego, co dokładnie robiłem. Jedynym zastrzeżeniem tej opcji jest to, że z jakiegoś powodu ESS ustawia bufor R tylko do odczytu, po załadowaniu R. Skrót do zapisywania bufora do zapisu to C-x C-q
.
To są moje ustawienia, których używam do pracy z ESS, czuję się z nimi zadowolony i nie odczuwałem potrzeby dodawania niczego od kilku lat. Przedstawiając ESS użytkownikom po raz pierwszy, zazwyczaj przedstawiam ten przegląd.
Zakończę ostatnim skrótem, który jest dla mnie najczęściej używanym skrótem podczas pracy z Emacsem, aw szczególności z ESS, C-g
który zamyka polecenie w mini-buforze. Przez wszystkie lata pracy z Emacsem i ESS wciąż udawało mi się wywołać polecenie Emacsa, którego nie chciałem, C-g
jest bardzo pomocne w takich sytuacjach.