> > It looks like when calling the dollar symbol using the function format, it > > treats the input argument as a character literal and does not evaluate it > > inside the function. I know we have the function `field` to get the slot > > variable, but I wonder if this is designed on purpose as the above example > > works for both list and S4 system.
It works almost the same way with lists, the difference being that an unknown name with a list gives NULL and not an error. > L <- list(A=101) > `$`(L, A) [1] 101 > `$`(L, "A") [1] 101 > i <- "A" > `$`(L, i) NULL The 2nd argument is treated as a symbol and is never evaluated. If it is given as a string literal then it is converted to a symbol - that is a holdover from the old days before backticks could be used to make symbol literals for symbols that included odd things like spaces and dollar signs. -Bill On Sat, Mar 27, 2021 at 7:49 AM Jiefei Wang <szwj...@gmail.com> wrote: > > Thanks, Duncan. Below is the repost of my question in plain text mode. > > > I'm trying to get the field value of a reference object by the field > name, but the dollar symbol behaves quite unusual. See example below > > .foo <- setRefClass( > "foo", > fields = list( > a = "integer" > ) > ) > x <- .foo$new(a=1L) > ## This is OK > x$a > ## This is OK > `$`(x, "a") > ## But this is not OK > i <- "a" > `$`(x, i) > > For the last line of code I get this error > > Error in envRefInferField(x, what, getClass(class(x)), selfEnv) : > ‘i’ is not a valid field or method name for reference class “foo” > > It looks like when calling the dollar symbol using the function > format, it treats the input argument as a character literal and does > not evaluate it inside the function. I know we have the function > `field` to get the slot variable, but I wonder if this is designed on > purpose as the above example works for both list and S4 system. > > Best, > Jiefei > > > On Sat, Mar 27, 2021 at 10:20 PM Duncan Murdoch > <murdoch.dun...@gmail.com> wrote: > > > > On 27/03/2021 10:16 a.m., Jiefei Wang wrote: > > > Hi all, > > > > > > I'm trying to get the field value of a reference object by the field name, > > > but the dollar symbol behaves quite unusual. See example below > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > *.foo <- setRefClass( "foo", fields = list( a = "integer" > > > ))x <- .foo$new(a=1L)## This is OKx$a## This is OK`$`(x, "a")## But this > > > is > > > not OKi <- "a"`$`(x, i)* > > > > This is really hard to read. Please post it again, but don't use HTML. > > > > Duncan Murdoch > > > > > > > > For the last line of code I get this error > > > > > > > > > *Error in envRefInferField(x, what, getClass(class(x)), selfEnv) : ‘i’ > > > is > > > not a valid field or method name for reference class “foo”* > > > > > > It looks like when calling the dollar symbol using the function format, it > > > treats the input argument as a character literal and does not evaluate it > > > inside the function. I know we have the function `field` to get the slot > > > variable, but I wonder if this is designed on purpose as the above example > > > works for both list and S4 system. > > > > > > Best, > > > Jiefei > > > > > > [[alternative HTML version deleted]] > > > > > > ______________________________________________ > > > R-devel@r-project.org mailing list > > > https://stat.ethz.ch/mailman/listinfo/r-devel > > > > > > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel