From p.dalgaard at biostat.ku.dk  Tue May  8 08:23:46 2007
From: p.dalgaard at biostat.ku.dk (Peter Dalgaard)
Date: Tue, 08 May 2007 08:23:46 +0200
Subject: [Rd] Problem calling $ inside a $ method
In-Reply-To: <m24pmn6hbm.fsf@ziti.local>
References: <m24pmn6hbm.fsf@ziti.local>
Message-ID: <46401772.1060201@biostat.ku.dk>

Seth Falcon wrote:
> Hello,
>
> I wonder if this will make it through the spam filters given the
> subject line.
>
> I'm seeing the following when trying to call a dollar method inside of
> a dollar method.
>
>
>     setClass("Foo", representation(d="list"))
>     [1] "Foo"
>
>     f <- new("Foo", d=list(bob=1, alice=2))
>
> ## We can call dollar at this level and it works as expected
>
>     `$`(f, "bo")
>     [1] 1
>
>     `$`(f, "al")
>     [1] 2
>   
`$`(f at d, "bo"), surely.
> ## So set a method on Foo that does this
>
>     setMethod("$", "Foo", function(x, name) `$`(x at d, name))
>     [1] "$"
>
> ## But it doesn't work.  Why?
>
>   
This has nothing to do with methods, it's $'s nonstandard evaluation 
rules that are doing you in. This doesn't work either

 > x <- "al"
 > `$`(f at d, x)
NULL

and the reason is that `$`(a,b) is _exactly_ equivalent to a$b insofar 
as auto-quoting the second argument is concerned
>     f$bo
>     NULL
>
>     f$al
>     NULL
>
>   
...so both of these look for f at d$name which isn't there.
> ## Here is a hackish workaround.
>
>     setMethod("$", "Foo", function(x, name)
>               eval(substitute(x at d$FOO, list(FOO=name))))
>     [1] "$"
>
>     f$bo
>     [1] 1
>
>     f$al
>     [1] 2
>
> Other suggestions for workarounds?  Is this a bug?
>   
Not a bug. Another workaround is to use "[[", but beware that Robert has 
evil intentions with respect to that and partial matching...



[Rd] Problem calling $ inside a $ method
Peter Dalgaard