From murdoch at stats.uwo.ca  Mon Jan  8 01:09:15 2007
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Sun, 07 Jan 2007 19:09:15 -0500
Subject: [Rd] substitute creates an object
	whichprints	incorrectly	(PR#9427)
In-Reply-To: <D79013E40FEF254AAF0D72DFC94F27482307C3@extas4-hba.tas.csiro.au>
References: <D79013E40FEF254AAF0D72DFC94F27482307C3@extas4-hba.tas.csiro.au>
Message-ID: <45A18BAB.6070708@stats.uwo.ca>

On 1/7/2007 6:55 PM, Mark.Bravington at csiro.au wrote:
>> 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...

You can do essentially that using a reference to a srcfilecopy, instead 
of a srcfile.  It keeps a copy of the source. The difference between 
this and your proposal is that if there are multiple functions defined 
in the same file, the source references of all of them refer to the same 
copy of the source file (so you can see the comments that came between 
the function definitions, etc.)

What is not done yet (and I probably won't have time to do for 2.5.0) is 
working out exactly what the user interface is that determines whether a 
srcfilecopy gets produced automatically.  Right now it only happens if 
you parse using the text= arg instead of the file= arg, but clearly 
there are situations where you'd want to save a copy even though you're 
reading from a file.

Duncan Murdoch

> 
> 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
>>
>>



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