¿Cuáles son algunas buenas referencias / consejos para aprender Emacs Speaks Statistics (con R)?

9

He estado usando R durante varios años, pero siempre he usado una GUI como Tinn-R, JGR y, más recientemente, R-Studio.

Aunque me gusta la interfaz de R-Studio, creo que para programas más largos con pocos / sin gráficos, podría codificar de manera más eficiente aprovechando los accesos directos que ofrece un editor de texto más básico como Emacs.

Instalé Emacs y el complemento ESS, todo funciona correctamente y he probado algunos códigos, pero me está costando acostumbrarme y no he encontrado un manual de referencia adecuado.

Las búsquedas de Google devuelven algunos sitios web muy anticuados con tutoriales que se centran principalmente en instalar y configurar los complementos y el manual en el sitio web oficial es un poco demasiado denso para mí.

Estoy buscando una introducción relativamente breve, (idealmente con una captura de pantalla y una lista de teclas de acceso rápido) diseñada para alguien que esté familiarizado con R, pero no con Emacs.

Cualquier referencia u otros consejos sobre cómo comenzar sería muy apreciada.

Será
fuente

Respuestas:

11

Primero, deberá aprender el texto básico que funciona con emacs. Dado que emacs es muy sofisticado, descubrir cómo simplemente seleccionar texto y copiar puede ser un desafío. Así que invierta algo de tiempo en descubrir cómo hacerlo de manera eficiente. Leer el manual puede ayudar. Para Mac OS X, use Aquamacs, admite accesos directos nativos.

Trabajar con ESS no difiere de trabajar con R. Deben aplicarse las mismas reglas para organizar el código. En mi caso, cada proyecto tiene su propio directorio, que reside en el directorio principal llamado R, que está en mi directorio de inicio (para Windows, recomiendo apuntar el directorio de inicio de emacs al directorio donde reside toda su fuente). Entonces, cuando uso ESS para trabajar en el proyecto, siempre lo hago M-x Ry selecciono el directorio de inicio de mi directorio de proyectos.

Después de comenzar el proceso R, generalmente divido emacs en dos ventanas (terminología de emacs). Luego, a la izquierda, tengo un código fuente, que envío al proceso R a la derecha. Los atajos relevantes (estos son atajos de emacs) son C-x 3para dividir ventanas verticalmente, C-x 1para hacer que el búfer actual sea la única ventana y C-x 2para dividir ventanas horizontalmente.

Al enviar código a R, mantengo la distinción entre funciones y declaraciones de R. Lo hago manteniendo todas mis funciones en un archivo que normalmente se llama 10code.R. Entonces simplemente puedo cargar este archivo usando la opción cargar archivo ESS (acceso directo C-c C-l). La ventaja de este enfoque es que genera todas las funciones y no produce nada en el búfer R. Si hay un error en su código, ESS muestra un mensaje en el minibúfer y puede investigarlo presionando C-c`.

El otro código son las declaraciones R, que trato de explicar por sí mismo: cargar datos, limpiar datos, ajustar el modelo estadístico, inspeccionar los resultados, producir los resultados finales. El código fuente de estas declaraciones es el estado actual del proyecto. La intención es que, una vez finalizado el proyecto, la fuente de los archivos con este código reproduzca el proyecto (también uso git para el historial de seguimiento). Cuando trabajo con este archivo, generalmente trabajo solo con una declaración R, que envío al proceso R a través de la función eval, párrafo, comando de declaración, que es el acceso directo C-c C-c. Este comando envía a R el proceso del párrafo, es decir, el texto delimitado por nuevas líneas. Esto es útil, ya que puede agrupar sentencias R en tareas y enviar tareas completas al proceso R. Tampoco requiere seleccionar texto, lo cual también es muy conveniente. El atajoC-c C-c tiene la ventaja de que mueve el cursor a la ventana R, por lo que puede inspeccionar de inmediato los resultados de la declaración R enviada.

Así que mi flujo de trabajo básico se mueve mucho entre ventanas y buffers. Para facilitar esto, uso los siguientes accesos directos en mi archivo .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)

Raramente uso f1, pero todos los demás con mucha frecuencia. Otras configuraciones específicas de ESS que uso son las siguientes:

(setq comint-input-ring-size 1000)
(setq ess-indent-level 4)
(setq ess-arg-function-offset 4)
(setq ess-else-offset 4)

Esto le dice a ESS que haga que la pestaña tenga 4 caracteres de ancho (el valor predeterminado es 2), que es mi preferencia personal, y expande el número de sus comandos emitidos que ESS guarda como un historial.

Para trabajar con el proceso R directamente, encontré los siguientes atajos muy útiles:

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

Esto recuerda la declaración R de su historial de declaraciones R, pero trata de hacerla coincidir con la que ya está en su línea. Entonces, por ejemplo, al escribir plen el proceso R y presionar \C-up(es decir, el control y la flecha hacia arriba) pasará por todas las declaraciones que comienzan pl, por lo que recordará, por ejemplo, todos los plot(...comandos.

La configuración final que uso con ESS es la siguiente:

(setq ess-ask-about-transfile t)

De esta manera, ESS siempre pregunta dónde guardar el texto en el búfer con el proceso R. Por lo general, numero estos archivos según la fecha, por lo que siempre tengo otra forma de rastrear lo que estaba haciendo exactamente. La única advertencia de esta opción es que, por alguna razón, ESS configura el búfer R para leer solo, después de cargar el R. El atajo para hacer que el búfer se pueda escribir es C-x C-q.

Así que estos son mis ajustes que utilizo para trabajar con ESS, me siento feliz con ellos y no sentí la necesidad de agregar nada durante algunos años. Cuando presento ESS a los usuarios nuevos, generalmente les doy esta descripción general.

Terminaré con el acceso directo final, que para mí es el acceso directo más utilizado cuando trabajo con Emacs y con ESS en particular, es el C-gque cierra el comando en el mini-búfer. A lo largo de todos los años que trabajo con Emacs y ESS, todavía consigo invocar algunos comandos de Emacs que no quería, C-ges muy útil en estas situaciones.

mpiktas
fuente
¡Gracias! Esta información es muy útil, intentaré configurar mi configuración de Emacs de manera similar. Con respecto a los puntos específicos del sistema operativo, estoy en Linux (Fedora 15), por lo que no estoy seguro de si eso hace alguna diferencia en la configuración / diseño.
Será el
Con Fedora deberías obtener los emacs simples. Recomendaría instalar ESS a mano en lugar de usar la versión suministrada por Fedora, ya que quizás sea demasiado antigua. Básicamente, primero verifique cómo se manipula el texto y qué tecla es meta. Sospecho M-w C-y C-wque funcionará como copiar, pegar, cortar.
mpiktas
2

Dependiendo de dónde se encuentre, esto puede no funcionar para usted, pero encontré a alguien en el pasillo que lo usó y los molestó con preguntas. Quédate con eso, ¡vale la pena!

Un consejo que encontré especialmente útil fue usar cua-mode; hace que emacs comparta algunos de los atajos de teclado más comunes (como guardar, cortar, copiar, etc.) con programas modernos. También encontré que el modo rectángulo es mucho más fácil de usar en cua-mode.

Aaron dejó Stack Overflow
fuente
2
Gracias por el consejo, habilité el modo CUA. Con respecto al otro consejo, una de mis motivaciones originales para aprender ESS fue observar qué tan rápido uno de mis profesores podía editar el código durante una conferencia. Estoy fuera del campus durante el verano, pero intentaré encontrar un "mentor" cuando regrese.
Será el