[R] R debugging options
John Fox
jfox at mcmaster.ca
Sat Apr 22 16:20:43 CEST 2006
Dear Brian,
I figured that there was a reason for using exists() that I didn't see. Do
you prefer using exists() to get() for reasons of efficiency (e.g.,
minimizing object copying)?
Thanks for this,
John
--------------------------------
John Fox
Department of Sociology
McMaster University
Hamilton, Ontario
Canada L8S 4M4
905-525-9140x23604
http://socserv.mcmaster.ca/jfox
--------------------------------
> -----Original Message-----
> From: Prof Brian Ripley [mailto:ripley at stats.ox.ac.uk]
> Sent: Saturday, April 22, 2006 3:08 AM
> To: John Fox
> Cc: r-help at stat.math.ethz.ch; 'Spencer Graves'
> Subject: Re: [R] R debugging options
>
> On Sat, 22 Apr 2006, Prof Brian Ripley wrote:
>
> > 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))] }
>
> Aargh, sapply does not simplify if the result is of length 0. Use
> unlist(lapply()) instead (which is incidentally slightly more
> efficient).
>
> > 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