[Rd] Rserve graphics output [was Re: C or Java code generation]
Simon Urbanek
simon.urbanek at r-project.org
Fri Aug 20 20:16:31 CEST 2010
On Aug 20, 2010, at 1:59 PM, Matt Shotwell wrote:
> On Fri, 2010-08-20 at 12:58 -0400, Sharpie wrote:
>>
>> Donald Paul Winston wrote:
>>>
>>> Aren't you the guy who created Rserve?
>>>
>>> I'd like to develop a web app so clients can perform exploratory data
>>> analysis with their browser with no installed software, not even java (I
>>> don't like applets). I thought R would be excellent for this but I need
>>> some issues cleared up before I invest a lot of time working with it.
>>>
>>
>> Well, Simon is the one who create Rserve. However, if you have questions
>> about Rserve it may be best to start a new thread or at least change the
>> subject header of your message. This discussion was about creating
>> stand-alone executables that use R code for deployment on a desktop.
>>
>>
>> Donald Paul Winston wrote:
>>>
>>> It appears R insists on directing plot output to a file. Is their a
>>> graphics device that keeps the output in memory so it can be returned to
>>> my java app as a stream of bytes? If I have to wait for it to write to a
>>> "unique file" and then read it back again then I don't think that's going
>>> to work. My web app needs to support hundreds of concurrent clients.
>>>
>>
>> As far as I know all R graphics output that does not go to a screen device,
>> such as an X window, must be directed to some sort of file. I am not aware
>> of a graphics device that provides output to something other than a screen
>> or a file, but there very well may be such a device in existence.
>
> This was essentially the conclusion of Donald's earlier thread...
>
>> The functionality you could describe could be implemented by writing a R
>> graphics device that forwards the R plotting commands to... well anywhere
>> you want, really. As the author of an R graphics device, I can say the
>> trickiest part of such an undertaking will be calculating font metrics so
>> that R can properly position text in the graphics. Everything else is very
>> straight-forward.
>
> I believe Donald wants the _rendered_ output. That is, a stream of bytes
> that represent a png, jpeg, etc. Toward this end, we have already
> discussed using an OS-level fifo to avoid disk I/O, and I think this is
> the easiest route for Donald.
>
> Alternatively, Donald might look into the X11 graphics driver, where
> Cairo is used to write pngs. In particular, the in_do_saveplot function
> (src/main/modules/X11/devX11.c) calls cairo_surface_write_to_png, in
> order to save a png to file. Cairo also provides the
> cairo_surface_write_to_png_stream function, which might be used to send
> png data to a memory buffer (i.e. a raw vector). I don't think it would
> be too difficult to modify in_do_saveplot to accommodate this.
>
That is all nice, it will require you to hack R (well, there is the Cairo device so you could make the change outside of R instead).
As always, the reason is buried deep inside -- the lack of connection API. If we had that, devices would take a connection instead of the file name and all would be well since you could use in-memory connections instead of files ... ;)
Cheers,
Simon
>> I have plans to write a device that forwards the plotting commands to a
>> socket connection that allows another program to execute them. In my case,
>> an Erlang backbone is used to route the results back to web clients using
>> websockets. The idea is to have the plot rendered directly in the client's
>> browser using a JavaScript library like RaphealJS. However, the school year
>> is upon me and the project will probably remain on the drawing board until
>> next summer.
>>
>>
>> Donald Paul Winston wrote:
>>>
>>> Is REngine.jar and REngineRserve.jar all I need in my web app?
>>>
>>
>> I can't comment on REngine as I have not used it.
>>
>>
>> Donald Paul Winston wrote:
>>>
>>> Also, how come their is no shutdown command from the command line for
>>> Rserve. I see one in the java client api. Do I have to write my own?
>>>
>>
>> I find that on UNIX a SIGTERM, SIGSTOP or SIGKILL signal broadcast using a
>> command line utility such as kill does the job.
>>
>> -Charlie
>>
>> -----
>> Charlie Sharpsteen
>> Undergraduate-- Environmental Resources Engineering
>> Humboldt State University
>
> --
> Matthew S. Shotwell
> Graduate Student
> Division of Biostatistics and Epidemiology
> Medical University of South Carolina
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
More information about the R-devel
mailing list