Primeiro, você precisará aprender texto básico operando com o emacs. Como o emacs é muito sofisticado, descobrir como simplesmente selecionar texto e cópia pode ser um desafio. Portanto, invista algum tempo para descobrir como fazer isso com eficiência. A leitura do manual pode ajudar. Para o Mac OS X, use o Aquamacs, ele suporta atalhos nativos.
Trabalhar com o ESS não difere de trabalhar com R. As mesmas regras para organizar o código devem ser aplicadas. No meu caso, todo projeto tem seu próprio diretório, que reside no diretório pai chamado R, que está no meu diretório inicial (no Windows, eu recomendo apontar o diretório home do emacs para o diretório em que reside toda a sua fonte). Então, quando eu uso o ESS para trabalhar no projeto, sempre faço M-x R
e seleciono o diretório inicial do diretório do meu projeto.
Depois de iniciar o processo R, geralmente divido o emacs em duas janelas (terminologia do emacs). À esquerda, tenho um código-fonte, que envio ao processo R à direita. Os atalhos relevantes (esses são atalhos do emacs) são C-x 3
para dividir janelas verticalmente, C-x 1
para tornar o buffer atual a única janela e C-x 2
para dividir janelas horizontalmente.
Ao enviar código para R, mantenho a distinção entre funções e instruções R. Eu faço isso mantendo todas as minhas funções em um arquivo normalmente chamado 10code.R
. Então, posso simplesmente carregar esse arquivo usando a opção de carregamento do arquivo ESS (atalho C-c C-l
). A vantagem dessa abordagem é que ela origina todas as funções e não produz nada no buffer R. Se houver um erro no seu código, o ESS mostrará uma mensagem no minibuffer e você poderá investigá-lo pressionando C-c
`.
O outro código são as instruções R, que tento manter auto-explicativas: carregar dados, limpar dados, ajustar modelo estatístico, inspecionar os resultados, produzir os resultados finais. O código fonte para essas instruções é o status atual do projeto. A intenção é que, após a conclusão do projeto, a fonte dos arquivos com esse código reproduza o projeto (também uso o git para rastrear o histórico). Ao trabalhar com esse arquivo, normalmente trabalho apenas com uma instrução R, que envio ao processo R por meio da função eval, paragraph, statement command, que é o atalho C-c C-c
. Este comando envia ao processo R o parágrafo, ou seja, o texto que é delimitado por novas linhas. Isso é útil, pois você pode agrupar instruções R em tarefas e enviar toda a tarefa para o processo R. Também não requer a seleção de texto, o que também é muito conveniente. O atalhoC-c C-c
tem a vantagem de mover o cursor para a janela R, para que você possa inspecionar imediatamente os resultados da instrução R enviada.
Portanto, meu fluxo de trabalho básico está se movendo muito entre janelas e buffers. Para facilitar isso, use os seguintes atalhos no meu arquivo .emacs:
(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)
Eu raramente uso f1
, mas todos os outros com muita frequência. Outras configurações ESS específicas que eu uso são as seguintes:
(setq comint-input-ring-size 1000)
(setq ess-indent-level 4)
(setq ess-arg-function-offset 4)
(setq ess-else-offset 4)
Isso instrui o ESS a aumentar a largura de 4 caracteres da guia (o padrão é 2), que é minha preferência pessoal, e expande o número de seus comandos emitidos que o ESS salva como histórico.
Para trabalhar diretamente com o processo R, achei os seguintes atalhos muito úteis:
(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)
)
)
Isso lembra a instrução R do seu histórico de instruções R, mas tenta combiná-la com a que já está na sua linha. Por exemplo, digitando pl
no processo R e pressionando \C-up
(que é controle e a seta para cima) percorrerá todas as instruções que começam com pl
, portanto, lembrará, por exemplo, todos os plot(...
comandos.
A configuração final que eu uso com o ESS é a seguinte:
(setq ess-ask-about-transfile t)
Dessa forma, o ESS sempre pergunta onde salvar o texto no buffer com o processo R. Normalmente, numero esses arquivos de acordo com a data, portanto sempre tenho outra maneira de rastrear o que exatamente estava fazendo. A única ressalva dessa opção é que, por algum motivo, o ESS define o buffer R como somente leitura, depois de carregar o R. O atalho para tornar o buffer gravável é C-x C-q
.
Portanto, essas são minhas configurações que eu uso para trabalhar com o ESS, me sinto feliz com elas e não sinto necessidade de adicionar nada por alguns anos. Ao apresentar o ESS para usuários iniciantes, geralmente dou essa visão geral.
Terminarei com o atalho final, que para mim é o atalho mais usado ao trabalhar com o Emacs e, em particular, com o ESS, C-g
que fecha o comando no mini-buffer. Durante todos os anos em que trabalho com o Emacs e o ESS, ainda consigo invocar alguns comandos do Emacs que eu não queria, C-g
são muito úteis nessas situações.