From hb at maths.lth.se  Wed Apr  5 16:24:53 2006
From: hb at maths.lth.se (Henrik Bengtsson)
Date: Wed, 5 Apr 2006 16:24:53 +0200
Subject: [Rd] page() (Was: Re: predict.smooth.spline.fit and Recall()
	(Was: Re: Return function from function and Recall()))
In-Reply-To: <Pine.LNX.4.64.0604051327390.20233@gannet.stats.ox.ac.uk>
References: <59d7961d0604050524v179d9130v61e8c2e99a4e7cbc@mail.gmail.com>
	<Pine.LNX.4.64.0604051327390.20233@gannet.stats.ox.ac.uk>
Message-ID: <59d7961d0604050724v4efce0c8t5d775f7fc399168c@mail.gmail.com>

On 4/5/06, Prof Brian Ripley <ripley at stats.ox.ac.uk> wrote:
> On Wed, 5 Apr 2006, Henrik Bengtsson wrote:
>
> > Here I think S3 dispatch is very natural.  Try the following:
>
> I don't: it is documented to work on a name not an object.

What comes first, the documentation of a method or the method itself?  ;)

I noticed the last year or so, that the documentation is being
referred to as a requirement/design specification, in addition to
being help pages.  If this is in general true, that is a good
guideline.  Has this evolved recently, or is it just me that missed it
before?

/Henrik

>
> > page <- function(x, method = c("dput", "print"), ...) UseMethod("page")
> >
> > page.getAnywhere <- function(x, ..., idx=NULL) {
> >  name <- x$name;
> >  objects <- x$obj;
> >
> >  if (length(objects) == 0)
> >    stop("no object named '", name, "' was found");
> >
> >  if (is.null(idx)) {
> >    # Include all non-duplicated objects found
> >    idx <- (1:length(objects))[!x$dups];
> >  }
> >
> >  for (ii in idx) {
> >    title <- paste(name, " (", x$where[ii], ")", sep="");
> >    eval(substitute({
> >      object <- x$obj[[ii]];
> >      page(object, ...);
> >    }, list(object=as.name(title))));
> >  }
> > }
> >
> > page.default <- utils::page;
> >
> > page(getAnywhere("predict.smooth.spline.fit"))
> >
> > You can have page.function(), page.character(), page.environment(),
> > etc. and make these call page.default() indirectly.  What I think
> > would be a very useful add on is to add an argument 'title' for which
> > you can set/override the title.  Then the "ugly" substitute() calls
> > could be limited to one specific case; where a "default" object is
> > passed and no title is set.
> >
> > If you want to, I could play around with a bit.
> >
> > /Henrik
> >
> > On 4/5/06, Kurt Hornik <Kurt.Hornik at wu-wien.ac.at> wrote:
> >>>>>>> Prof Brian Ripley writes:
> >>
> >>> On Wed, 5 Apr 2006, Henrik Bengtsson wrote:
> >>>> Hi,
> >
> > [snip]
> >
> >>> As for
> >>
> >>>>> PS, may I suggest to modify page() so that
> >>>>> 'page(getAnywhere("predict.smooth.spline.fit"))' works? DS.
> >>
> >>> it is rather tricky.  page() takes a name aka symbol as its argument
> >>> (and is thereby S-compatible), and also works with a bare character
> >>> string (undocumented).  What you have here is a call that does not
> >>> even return a function.  It is more reasonable that
> >>> stats:::predict.smooth.spline.fit should work, and it is also a call.
> >>> I have in the past thought about special-casing that, but it is a
> >>> valid name (you would have to back-quote it, but it does work).  So
> >>> one possible way out would be to use get() on a name and evaluate
> >>> calls, e.g.
> >>
> >>> page <- function(x, method = c("dput", "print"), ...)
> >>> {
> >>>      subx <- substitute(x)
> >>>      have_object <- FALSE
> >>>      if(is.call(subx)) {
> >>>          object <- x
> >>>          have_object <- TRUE
> >>>          subx <- deparse(subx)
> >>>      } else {
> >>>          if(is.character(x)) subx <- x
> >>>          else if(is.name(subx)) subx <- deparse(subx)
> >>>          if (!is.character(subx) || length(subx) != 1)
> >>>              stop("'page' requires a name, call or character string")
> >>>          parent <- parent.frame()
> >>>          if(exists(subx, envir = parent, inherits=TRUE)) {
> >>>              object <- get(subx, envir = parent, inherits=TRUE)
> >>>              have_object <- TRUE
> >>>          }
> >>>      }
> >>>      if(have_object) {
> >>>          method <- match.arg(method)
> >>>          file <- tempfile("Rpage.")
> >>>          if(method == "dput")
> >>>              dput(object, file)
> >>>          else {
> >>>              sink(file)
> >>>              print(object)
> >>>              sink()
> >>>          }
> >>>       file.show(file, title = subx, delete.file = TRUE, ...)
> >>>      } else
> >>>       stop(gettextf("no object named '%s' to show", subx), domain = NA)
> >>> }
> >>
> >>> which also allows 1-element character vectors (and I am not entirely
> >>> sure we want that).
> >>
> >> There was a similar issue with prompt() (actually, its default method)
> >> for which I ended up "temporarily" providing the following (argh):
> >>
> >>         else {
> >>             name <- substitute(object)
> >>             if (is.name(name))
> >>                 as.character(name)
> >>             else if (is.call(name) && (as.character(name[[1]]) %in%
> >>                 c("::", ":::", "getAnywhere"))) {
> >>                 name <- as.character(name)
> >>                 name[length(name)]
> >>             }
> >>             else stop("cannot determine a usable name")
> >>         }
> >>
> >> Best
> >> -k
> >>
> >> ______________________________________________
> >> R-devel at r-project.org mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-devel
> >
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
> >
>
> --
> 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
>
>


--
Henrik Bengtsson
Mobile: +46 708 909208 (+2h UTC)



[Rd] page() (Was: Re: predict.smooth.spline.fit and Recall() (Was: Re: Return function from function and Recall()))
Henrik Bengtsson