[R] R debugging options

Prof Brian Ripley ripley at stats.ox.ac.uk
Sat Apr 22 09:15:28 CEST 2006


On Fri, 21 Apr 2006, John Fox wrote:

> Dear Spencer,
>
> I wasn't aware of getFunctions(), though I've now taken a look at it. It's
> pretty similar to listFunctions() (from my email to the list), except that
> getFunctions() uses exists() rather than is.function() to test whether an
> object is a function. There must be a reason for this, but I can't think
> what it is, since in both cases the vector of object names shouldn't include
> nonexistent objects.

John,

Your code uses eval(parse()) to find the object, and that is somewhat 
clumsy.  A more usual way would be

function(x) is.function(get(x, envir=envir))

and exists() can shortcircuit that by asking for a particular 'mode'. 
There's a prototypical version in utils::ls.str of using exists(), and
a simpler yet more powerful version than either of yours would be

listFunctions <- function(all.names=FALSE, envir=.GlobalEnv){
      # all.names=TRUE: include names beginning with "."
      # envir: environment to search
      envir <- as.environment(envir)
      z <- ls(envir=envir, all.names=all.names)
      z[sapply(z, function(x) exists(x, mode="function",
                                     envir=envir, inherits=FALSE))]
}

Note that inherits=FALSE is needed, for although the named object exists, 
exists() has been told to search for a function of that name and might 
find one elsewhere.  (ls.str appears to have that wrong.)

Now for some pickiness: what is a 'function'?  This lists "$" as a 
function, which it is, but it is not a closure.  Although 
exists(mode="closure") would appear to be documented to differentiate, it 
does not and so one needed function(x) typeof(get(x, ...)) == "closure".

Brian

>
> Regards,
> John
>
> --------------------------------
> John Fox
> Department of Sociology
> McMaster University
> Hamilton, Ontario
> Canada L8S 4M4
> 905-525-9140x23604
> http://socserv.mcmaster.ca/jfox
> --------------------------------
>
>> -----Original Message-----
>> From: Spencer Graves [mailto:spencer.graves at pdf.com]
>> Sent: Friday, April 21, 2006 11:21 AM
>> To: John Fox
>> Cc: 'Larry Howe'; r-help at stat.math.ethz.ch; Philippe Grosjean
>> Subject: Re: [R] R debugging options
>>
>> 	  Regarding a function that lists functions, have you
>> considered "getFunctions" in library(svIDE)?  You need to
>> provide the argument, as
>> in "getFunctions(1)";   "getFunctions()" returns an error message.
>>
>> 	  Beyond this, the "objects" function in S-Plus (at
>> least version 6.2) has a "classes" argument, which the R
>> 2.2.1 implementation does not have.  It doesn't look like it
>> would be too difficult to add such an argument to "objects"
>> in R, but I have not been in a position to volunteer to do
>> it, and without that, I didn't feel it was appropriate for me
>> to suggest it.
>>
>> 	  hope this helps,
>> 	  spencer graves
>>
>> John Fox wrote:
>>
>>> Dear Larry,
>>>
>>> I'm not aware of an existing function that lists functions,
>> but here's
>>> a simple solution:
>>>
>>> listFunctions <- function(all.names=FALSE, envir=.GlobalEnv){
>>>     # all.names=TRUE: include names beginning with "."
>>>     # envir: environment to search
>>>     Objects <- objects(envir, all.names=all.names)
>>>     if (length(Objects) == 0) Objects
>>>     else names(which(sapply(Objects,
>>>         function(object) is.function(eval(parse(text=object),
>>> envir=envir)))))
>>>     }
>>>
>>> Getting mtrace() to use the function names returned by
>> listFunctions()
>>> is a bit tricky, because of the way mtrace() evaluates its
>> arguments.
>>> You could do something like the following:
>>>
>>> for(f in listFunctions()) mtrace(char.fname=f)
>>>
>>> Perhaps someone else knows of an existing or better solution.
>>>
>>> I hope this helps,
>>>  John
>>>
>>> --------------------------------
>>> John Fox
>>> Department of Sociology
>>> McMaster University
>>> Hamilton, Ontario
>>> Canada L8S 4M4
>>> 905-525-9140x23604
>>> http://socserv.mcmaster.ca/jfox
>>> --------------------------------
>>>
>>>
>>>> -----Original Message-----
>>>> From: r-help-bounces at stat.math.ethz.ch
>>>> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Larry Howe
>>>> Sent: Tuesday, April 18, 2006 12:46 PM
>>>> To: r-help at stat.math.ethz.ch
>>>> Subject: Re: [R] R debugging options
>>>>
>>>> On Monday April 17 2006 21:08, Francisco J. Zagmutt wrote:
>>>>
>>>>> RSiteSearch("debug") or RSiteSearch("debugging") will give
>>>>
>>>> you a lot
>>>>
>>>>> or relevant information.  I personally use library(debug)
>>>>
>>>> extensivelly
>>>>
>>>>> and it should do all the taks you asked about. There is a
>>>>
>>>> nice article
>>>>
>>>>> describing the debug lilbrary in the 2003/3 issue of R News
>>>>> http://cran.r-project.org/doc/Rnews/Rnews_2003-3.pdf
>>>>>
>>>>> Cheers
>>>>>
>>>>> Francisco
>>>>
>>>> Wow! That is a great package. I think it does all I need.
>>>>
>>>> Is there a way to turn on debugging for all loaded functions?
>>>> My source file contains many functions and I would prefer
>> not to have
>>>> to mtrace() each one.
>>>> Something like
>>>>
>>>>
>>>>> mtrace(how_do_I_get_a_list_of_all_loaded_functions)
>>>>
>>>> ?
>>>>
>>>> Larry
>>>>
>>>> ______________________________________________
>>>> R-help at stat.math.ethz.ch mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide!
>>>> http://www.R-project.org/posting-guide.html
>>>
>>>
>>> ______________________________________________
>>> R-help at stat.math.ethz.ch mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide!
>> http://www.R-project.org/posting-guide.html
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list