[Rd] substitute creates an object whichprints incorrectly (PR#9427)

Mark.Bravington at csiro.au Mark.Bravington at csiro.au
Mon Jan 8 00:55:38 CET 2007


> I think we should get rid of source attributes completely, 
> since they are no longer needed, but your comment still 
> applies to source references. We should strip them when code 
> gets modified.
> 
> Duncan Murdoch

I would be very concerned about losing source attributes-- it would
break a lot of my code :(! It's very useful to have a single portable R
object that contains the whole of a function, including its printable
representation with full comments and formatted in whatever style the
author prefers (and indeed the documentation, in the way I work); I use
.Rdata files to swap multiple functions & data with colleagues all the
time.

Source references-to-files entail having to keep track of separate
files, so are much less portable.

I haven't had time to follow Duncan's recent changes on source
references, but would it also be possible to use the new
attribute-attaching-indexing mechanism to point to places in the
'source' attribute rather than in a file? That might offer the best of
both worlds to dinosaurs like me who rely on source attributes...

Mark Bravington

CSIRO Mathematical & Information Sciences
Marine Laboratory
Castray Esplanade
Hobart 7001
TAS

ph (+61) 3 6232 5118
fax (+61) 3 6232 5012
mob (+61) 438 315 623
 

> 
> > 
> >> Perhaps the compromise has to be to warn people that 
> keep.source=TRUE 
> >> can be dangerous in this way, both in the help informaton for 
> >> options() and for substitute().
> >>
> >> ?
> >>
> >> Bill Venables.
> >>
> >> -----Original Message-----
> >> From: Peter Dalgaard [mailto:p.dalgaard at biostat.ku.dk]
> >> Sent: Friday, 22 December 2006 9:47 PM
> >> To: Venables, Bill (CMIS, Cleveland)
> >> Cc: r-devel at stat.math.ethz.ch; R-bugs at biostat.ku.dk
> >> Subject: Re: [Rd] substitute creates an object which prints 
> >> incorrectly
> >> (PR#9427)
> >>
> >> Bill.Venables at csiro.au wrote:
> >>   
> >>> The function "substitute" seems to fail to make a genuine 
> >>> substitution, although the printed verision seems fine.  
> Here is an 
> >>> example.
> >>>
> >>>   
> >>>     
> >>>> m <- substitute(Y <- function(x) FUN(x+1),
> >>>>     
> >>>>       
> >>> + list(Y = as.name("y"), FUN = as.name("sin")))
> >>>   
> >>>     
> >>>> m
> >>>>     
> >>>>       
> >>> y <- function(x) sin(x + 1)
> >>>   
> >>>     
> >>>> eval(m)
> >>>> y
> >>>>     
> >>>>       
> >>> function(x) FUN(x+1)
> >>>
> >>> However the story doesn't end there.  The substitution appears to 
> >>> have been made, even though the printed version, this 
> time, suggests 
> >>> otherwise.
> >>>
> >>>   
> >>>     
> >>>> y(pi)
> >>>>     
> >>>>       
> >>> [1] -0.841471
> >>>   
> >>>     
> >>>> sin(pi+1)
> >>>>     
> >>>>       
> >>> [1] -0.841471
> >>>   
> >>>
> >>>   
> >>>     
> >> Yes, this is (fairly) well known. It has to do with the 
> retention of 
> >> function source.
> >>
> >> The thing to notice is that it is only the printing of y that is 
> >> really confused. If you do
> >>
> >> dput(y)
> >> attr(y, "source")
> >> attr(y, "source") <- NULL
> >> y
> >>
> >> then you should see the point. The tricky bit is that the "source" 
> >> attribute exists in an intermediate form inside m. Notice that m 
> >> contains, not the function itself, but a call to the function 
> >> `function`
> >>
> >> which creates the function when eval'ed. This call contains the 
> >> function
> >>
> >> source as its 4th element (look at m[[3]][[4]] in your 
> example), and 
> >> you
> >>
> >> might try setting it to NULL and see how things will clear up.
> >>
> >> The issue with substitute is that it cannot sensibly 
> substitute into 
> >> character vectors, so it just leaves  the source as is, 
> which gives 
> >> the symptoms you see. It could, however, and probably should, 
> >> recognize calls to `function` and NULL out their 4th element. It 
> >> cannot be done completely failsafe though (`function` could result 
> >> from a computation, or even be part of the substitution), 
> so one has 
> >> to decide that the extreme cases are too extreme worry about them.
> >>  
> >> -pd
> >>
> >>   
> >>> Bill Venables
> >>> CMIS, CSIRO Laboratories,
> >>> PO Box 120, Cleveland, Qld. 4163
> >>> AUSTRALIA
> >>> Office Phone (email preferred): +61 7 3826 7251 
> >>> Fax (if absolutely necessary):    +61 7 3826 7304 
> >>> Mobile (rarely used):                +61 4 1963 4642 
> >>> Home Phone:                          +61 7 3286 7700 
> >>> mailto:Bill.Venables at csiro.au
> >>> http://www.cmis.csiro.au/bill.venables/
> >>>
> >>>
> >>> --please do not edit the information below--
> >>>
> >>> Version:
> >>>  platform = i386-pc-mingw32
> >>>  arch = i386
> >>>  os = mingw32
> >>>  system = i386, mingw32
> >>>  status =
> >>>  major = 2
> >>>  minor = 4.1
> >>>  year = 2006
> >>>  month = 12
> >>>  day = 18
> >>>  svn rev = 40228
> >>>  language = R
> >>>  version.string = R version 2.4.1 (2006-12-18)
> >>>
> >>> Windows XP Professional (build 2600) Service Pack 2.0
> >>>
> >>> Locale:
> >>>
> >>>     
> >> 
> LC_COLLATE=English_Australia.1252;LC_CTYPE=English_Australia.1252;LC_
> >> MON
> >>   
> >> 
> ETARY=English_Australia.1252;LC_NUMERIC=C;LC_TIME=English_Australia.1
> >> 252
> >>   
> >>> Search Path:
> >>>  .GlobalEnv, .R_Store, package:RODBC, package:xlsReadWrite, 
> >>> package:cluster, package:vegan, package:ASOR, package:stats, 
> >>> package:graphics, package:grDevices, package:utils, 
> >>> package:datasets, .R_Data, .R_Utils, package:svIDE, 
> package:tcltk, 
> >>> package:methods, Autoloads, package:base
> >>>
> >>> ______________________________________________
> >>> 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
> >>
> > 
> > ______________________________________________
> > 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
> 
>



More information about the R-devel mailing list