[Rd] [R] step by step debugger in R?
Simon Urbanek
simon.urbanek at r-project.org
Mon May 25 17:31:52 CEST 2009
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
>
>
>
More information about the R-devel
mailing list