From tplate at acm.org  Sat Jan 24 00:09:48 2009
From: tplate at acm.org (Tony Plate)
Date: Fri, 23 Jan 2009 16:09:48 -0700
Subject: [Rd] overwriting '<-' and infinite recursions
In-Reply-To: <a0428ec90901231348u7a23facdl4c4cd26ec16fdc96@mail.gmail.com>
References: <a0428ec90901231241u561a5848re009b252bf7d1808@mail.gmail.com>	<alpine.DEB.1.00.0901231517430.6710@luke-inspiron>
	<a0428ec90901231348u7a23facdl4c4cd26ec16fdc96@mail.gmail.com>
Message-ID: <497A4E3C.9070709@acm.org>

I wonder if you might be able to make use of R's "active bindings."  
These enable you to set things up so that a user definable function is 
called when an assignment is made or when a value is accessed.  It's 
sort of like overriding assignment for a particular variable, but you 
don't need to mess with the definition of assignment.

Do
 > apropos("binding")
to see the related functions.  The help page for makeActiveBinding has a 
simple example.

-- Tony Plte

Yi Zhang wrote:
> Thanks, Luke. I would certainly be very happy to see any non-intrusive
> solution. The problem I'm dealing with is: I'm creating a new class
> which references some external resource (file or database) and I want
> to make the reference counting work. An example (-> means references):
> Initially we have symbol a -> object oa of my class -> file fa.
> Suppose then R code "b<-a" is executed. With no modification to the
> '<-' function, R would make another symbol b and bind it to oa.
> Imagine next "b[1]<-0" is executed. Here comes the trouble: R only
> knows to duplicate oa to another ob; the modification will be done to
> the underlying shared file fa. Of course, I have necessary code for
> overriding "[<-" and make that modification. The whole thing is
> because I'm not aware of any sharing of the external resource at the R
> level. That's the motivation for me to
> overwrite '<-' in the first place. Any potential alternative solutions?
>
> On Fri, Jan 23, 2009 at 4:25 PM,  <luke at stat.uiowa.edu> wrote:
>   
>> While it _may_ be possible to make this work in current R (I don't
>> know if it is) this is a Really Bad Idea as it will affect every other
>> piece of R code run on the system. It also may not work at all in
>> future versions of R (assignment is sufficiently core functionality
>> that it may not be implemented via a function at all in some
>> circumstances).  Locked bindings are locked for a reason: we as
>> developers can assume that their values are what we intend them to be.
>> If those values are changed then that assumption fails and some things
>> may stop working.
>>
>> If you explain what your needs are someone on the list can probably
>> help you find a more effective and less intrusive way of doing it.
>>
>> luke
>>
>>
>> On Fri, 23 Jan 2009, Yi Zhang wrote:
>>
>>     
>>> Hello all,
>>>
>>> I'm having a problem when overwriting the '<-' function and was told
>>> I'd better post it here for help. The reason why I need to overwrite
>>> it is complicated and not easy to tell in a few words; but this seems
>>> the only clean option other than hacking R's core source code. My code
>>> looks like:
>>>
>>> # in .onLoad of a package; or if you want to test, put it in a function
>>> env <- as.environment('package:base')
>>> unlockBinding('<-',env)
>>> assign('<-', newAssign, envir=env)
>>> .Internal(lockBinding(as.name('<-'), env))
>>> #not using lockBinding directly because it calls '<-'
>>>
>>> It gave me this error: Error: evaluation nested too deeply: infinite
>>> recursion / options(expressions=)?
>>>
>>> Any suggestion is appreciated!
>>>
>>> --
>>> Yi
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>>       
>> --
>> Luke Tierney
>> Chair, Statistics and Actuarial Science
>> Ralph E. Wareham Professor of Mathematical Sciences
>> University of Iowa                  Phone:             319-335-3386
>> Department of Statistics and        Fax:               319-335-3017
>>   Actuarial Science
>> 241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
>> Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu
>>
>>     
>
>
>
>



[Rd] overwriting '<-' and infinite recursions
Tony Plate