On Sun, Mar 20, 2011 at 12:43 PM, Duncan Murdoch
<murdoch.duncan@gmail.com>wrote:

> On 11-03-19 10:21 PM, Kenn Konstabel wrote:
>
>> On Sun, Mar 20, 2011 at 4:13 AM, Kenn Konstabel<lebatsnok@gmail.com>
>>  wrote:
>>
>>  you can omit the list and do the following:
>>>
>>>
>>> /.../
>>>
>>>  (but you don't really need "this" in this case as you can use "balance"
>>> instead of "this$balance")
>>>
>>>
>> P.S. using "this" would make some difference in one case:
>>
>> instead of
>>           total<<- total + amount # need<<- here
>> you can have
>>        this$total<- this$total + amount # can use<-
>>
>
> This is a very un-R-like way of programming, so I wouldn't recommend it.
>  The reason it works is that environment objects are special:  they are
> handled by reference, whereas with most other kinds of objects assignment
> creates a new copy, and assignment with "<-" makes the assignment locally.
>
> So if at some point you switched this to be a list() object instead of an
> environment, the line
>
>
> this$total <- this$total + amount
>
> would have quite a different meaning.
>

I agree that all this is mostly only useful for learning how R works, but
then again, the proto package uses something quite similar. Quoting the
proto version of open.account from a previous mail:

            .$total <- .$total + amount

The following wouldn't work there:

            total<<-total+amount

As a side dish, it might sometimes be useful to make a function return its
environment rather its usual value (if only for the curious people who want
to see what is "inside"). The following function does this by just adding
environment() as a last line:

strip <-
function(fun.){
# not sure if it's done in the optimal way here
    bf <- body(fun.)
    cb <- quote({})
    cb[[2]] <- bf
    cb[[3]] <- quote(environment())
    body(fun.) <- cb
    fun.
    }

> ls(strip(open.account.2)(100))
[1] "balance"  "deposit"  "this"     "total"    "withdraw"

Best regards,

Kenn Konstabel

	[[alternative HTML version deleted]]

