On Oct 24, 2010, at 4:21 PM, Vitalie S. wrote: > David Winsemius <dwinsem...@comcast.net> writes: > >> On Oct 24, 2010, at 5:35 AM, Vitalie S. wrote: >> >>> >>> This might be just beyond of my understanding of how assignment works in R, >>> but >>> the documentation does not say anything about: >>> >>>> tv <- c(a="dsf", b="sss") >>>> tl <- list(232) >>>> `$<-`(tl, tv[[1]], "sdfdsfdsfsd") >>> Error: invalid subscript type 'language' >> >> Are either of these what you should have done to get what it appears you >> were aiming for but didn't specify? >> > > I meant what I wrote there. After the assignment, the list tl should have > element 'dsf' with the > value "sdfdsfdsfsd" (sorry for bad names). >
No, as David pointed out the documentation tells you unmistakably: "[...] The main difference is that ‘$’ does not allow computed indices [...]" so you want to use `[[` instead since `$` is defined exactly to not allow just what you're doing: the index argument must be a symbol or a character vector of length one - anything else is an error as you see. Cheers, Simon >> `$<-`(tl, "sdfdsfdsfsd", tv[[1]]) >> # yields >> [[1]] >> [1] 232 >> >> $sdfdsfdsfsd >> [1] "dsf" >> >>> `[<-`(tl, tv[[1]], "sdfdsfdsfsd") >> [[1]] >> [1] 232 >> >> $dsf >> [1] "sdfdsfdsfsd" >> >> The "$" operator does not evaluate the index whereas the "[" function does. >> And the documentation is quite clear >> about that distinction. >> > > If it is evaluated or not it is hardly an explanation for the error. It throws > the error before the method is even dispatched. If the index (in $'s case the > name) is unevaluated then my methods should get an expression 'tv[[1]]', > which I > can then handle. > > Example: > > setClass("classX", contains="list") > setMethod("$<-", "classX", > function(x, name, value){ > print("I am here!!") > x > }) > > x <- new("classX") > tv <- c("aa", "bb") > `$<-`(x, tv[[1]], 4343) > #gives > Error: invalid subscript type 'language' > > >> -- >> David Winsemius. >> >>> >>> This happens even before the method is dispatched. I can not handle the >>> "name" argument in my S4 method, because it's not even entered. >>> >>> Thanks, >>> Vitalie. > > ______________________________________________ > 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