From jmc at r-project.org  Thu Apr  7 23:50:26 2011
From: jmc at r-project.org (John Chambers)
Date: Thu, 07 Apr 2011 14:50:26 -0700
Subject: [Rd] How to debug reference classes?
In-Reply-To: <1302202852028-3434269.post@n4.nabble.com>
References: <1302202852028-3434269.post@n4.nabble.com>
Message-ID: <4D9E31A2.1070108@r-project.org>

This is a good wish-list item.  The natural mechanism would be a version 
of the standard trace() function as a reference method with the same 
arguments as the current trace(), minus those that make no sense.  So:
    xx$trace(edit, browser)
for example, to trace execution of the reference method "edit" defined 
in the class of xx.  The mechanism does not exist now, and will require 
some modifications or extensions to the existing trace() implementation.

Meanwhile, the following slightly ugly workaround seems to apply trace() 
to a reference method.  Here, xx is the object created in the example 
for ReferenceClasses, with method $edit().  [Actually running the 
example removes the class definition, so this was done from a copy of 
the source code for the example.]

The steps in the workaround:

- make a copy of the method,
   edit <- xx$edit

- arrange to trace it in xx:
   trace(edit, browser, where = xx)
(this produces a note and a warning, but they seem harmless)

- remove the copy (just to be safe)
   rm(edit)

- now run things with whatever trace action you speficied.

- if needed after debugging, untrace() the method.
   untrace("edit", where = xx)

An example is below.

Of course, one could also just define xx$edit to call a regular 
function, say myEdit() and trace that.  But the workaround doesn't 
require changing the existing definition.

Suggestions for a better or less ugly workaround are welcome.  I'll look 
at fixing up a trace() method for 2.13.1

John

==============================
 > edit <- xx$edit
 > trace(edit, browser, where = xx)
Constructing traceable class "refMethodDefWithTrace"
Environment of class "refMethodDef" is locked; using global environment 
for new class
Tracing function "edit" in package "2011-04-07 14:34:43"
[1] "edit"
Warning message:
In getPackageName(whereF) :
   Created a package name, "2011-04-07 14:34:43", when none found
 > rm(edit)
 > xx$edit(1,2,3)
Tracing xx$edit(1, 2, 3) on entry
Called from: eval(expr, envir, enclos)
Browse[1]> objects()
[1] "i"     "j"     "value"
Browse[1]> j
[1] 2
Browse[1]> j <- 3
Browse[1]>
 > xx$data
      [,1] [,2] [,3]
[1,]    1    5    3
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12
 > untrace("edit", where = xx)
Untracing function "edit" in package "2011-04-07 14:34:43"
 > xx$edit(1,2,-1)
 > xx$data
      [,1] [,2] [,3]
[1,]    1   -1    3
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

============================================

On 4/7/11 12:00 PM, A Zege wrote:
> How do you debug methods of a reference class? I've been using mtrace, which
> is excellent, but i cannot figure out how to mtrace a reference class
> method. Maybe there is some other way to debug these, for example with
> ordinary trace? for now i am only able to use options(error=recover), which
> is not giving me idea where exactly in the code i am once i am stopped on an
> error.
>
> --
> View this message in context: http://r.789695.n4.nabble.com/How-to-debug-reference-classes-tp3434269p3434269.html
> Sent from the R devel mailing list archive at Nabble.com.
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] How to debug reference classes?
John Chambers