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
>   
`$`([EMAIL PROTECTED], "bo"), surely.
> ## So set a method on Foo that does this
>
>     setMethod("$", "Foo", function(x, name) `$`([EMAIL PROTECTED], 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"
 > `$`([EMAIL PROTECTED], 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 [EMAIL PROTECTED] which isn't there.
> ## Here is a hackish workaround.
>
>     setMethod("$", "Foo", function(x, name)
>               eval(substitute([EMAIL PROTECTED], 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...

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to