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