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

Reply via email to