[ESS] Displaying plots in Emacs

Vitalie Spinu @p|nuv|t @end|ng |rom gm@||@com
Tue May 19 16:22:19 CEST 2015


 >>> Michael Lawrence on Mon, 18 May 2015 21:30:37 -0700 wrote:

 > The issue is how we actually transfer the SVG data to Emacs.  I could see
 > doing something with sockets, but that sounds redundant with nREPL.

Yes, that's exactly the idea. Transfer either SVG or raw png data
through sockets or other transfer channels. Good thing about nREPL is
that the transfer layer is by construction separated. You can add
whatever weirdo transfer protocols latter and everything else will work
out of the box. My plan is to have TCP sockets first and Web Sockets a
bit later.

  > How far along is nREPL?

Conceptually it's pretty far. I have a pretty clear picture of what has
to be done. But it's a fairly complex issue with many running
pieces. Here are the main ones.

 - The R-nREPL is pretty basic now. It uses R's builtin connection
   system that is limited to only one client per server's
   session. That's unacceptable from a tool which calls itself "network
   REPL".

   My plan is to base it on libuv [1], but that means writing a separate
   binding package.

 - Emacs nrepl-client.el [2] is tightly bound with CIDER/clojure
   ecosystem. I have already done some work on cleaning and splitting it
   up, but more should still be done.

 - Emacs support for image manipulation sucks. Simply displaying images
   in repl window is not what I would be satisfied with. I have now
   almost finished image-transform and image-display [3]. Image-display
   is a replacement for image-mode that works well with potentially very
   long chains of images and abstracts from the physical representation
   of those images. You can have images as files, archives, email
   attachment or piped through nREPL. The exact physical representation
   doesn't matter, the UI is the same for all cases.

 - nREPL is by construction asynchronous and R's inability to do basic
   concurrency is a huge handicap. So additional tooling must be build
   which is not needed for Clojure.

   My workaround idea is to have one R master server and one R slave
   fork for each new client instance, The master will take care of
   routing client requests to slave forks and will also be responsible
   for tooling requests which are different from eval requests
   (completions, help etc). That would allow a pretty good amount of
   non-blocking communication and should be more than enough for most
   needs.

 Vitalie


[1] https://github.com/libuv/libuv
[2] https://github.com/clojure-emacs/cider/blob/master/nrepl-client.el
[3] https://github.com/vspinu/image-display




More information about the ESS-help mailing list