On May 25, 2009, at 4:54 PM, Romain Francois wrote:
Simon Urbanek wrote:
[snip]
I need to read more about embedding R (as in section 8 of WRE). I
know you can supply your own implementation of the REPL, but I am
not sure this includes the one that goes on once trapped into the
browser.
Yes - it would be quite useless otherwise ;) there are many
examples of GUIs that use it (including the built-in ones [Windows,
MAc, ..] or external ones e.g JGR).
Cheers,
S
Hi Simon,
Do you mean the rReadConsole callback ? I managed to make some minor
modifications to the rtest.java example that comes with JRI to
somewhat emulate automatically call some code (ls.str()) in this
example at the browser prompt, before giving the prompt to the user.
static boolean browse_first = true ; public String
rReadConsole(Rengine re, String prompt, int addToHistory) {
System.out.print(prompt);
if( prompt.startsWith( "Browse[") ){
if( browse_first ){
System.out.println( "\n>>>> re.eval( \"
print( ls.str() )\" ); " ) ;
re.eval( "print( ls.str() )" ) ;
browse_first = false ;
System.out.println( "\n>>>> return
\"ls.str()\"" ) ;
return "ls.str()\n" ;
} else{
browse_first = true ;
}
}
...
}
It seems to work and could get me somewhere, although it has a "it
works, but it does not feel right" taste. Basically the code
pretends the user typed "ls.str\n" at the browse prompt, so that the
R evaluator evaluates it, and then comes back to the browse prompt.
There is also the re.eval( "print( ls.str() )" ) part which was my
first attempt, but apparently this gets evaluated in the global
environment, which is no good. I can get around that by returning
some sort of "record the sys.frames and sys.calls somewhere and do
something with them" function, but I was wondering if you meant
something else.
Well, it's entirely up to you - the REPL is working. I wasn't
suggesting you have to use JRI for the debugger, I was just pointing
out that browsing is treated as a regular prompt on the REPL, so any
embedding has access to it.
The JRI eval() command has nothing to do with this directly - you can
evaluate in any environment, just not specifying anything will throw
you in the global environment - it's really up to you (it just
abstracts out the direct access to parse and eval part of R - you can
(ab)use it any way you see fit).
Cheers,
Simon
Romain
Here is the transcript of a simple session of ./run rtest (with the
small adjustement above)
> f <- function( x= 5) browser()
rBusy(1)
rBusy(0)
> f()
rBusy(1)
Called from: f()
rBusy(0)
Browse[1]>
>>>> re.eval( " print( ls.str() )" );
a : chr "hello"
b : 'data.frame': 3 obs. of 2 variables:
$ a: num 1.2 2.3 4.5
$ b: num 1.4 2.6 4.2
bool : logi [1:3] TRUE FALSE FALSE
f : function (x = 5) iris : 'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1
1 1 1 1 1 1 ...
>>>> return "ls.str()"
rBusy(1)
x : num 5
rBusy(0)
Browse[1]>
rBusy(0)
>
--
Romain Francois
Independent R Consultant
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel