[Rd] "$<-" fails (invalid subscript type 'language')

Vitalie S. spinuvit.list at gmail.com
Mon Oct 25 09:51:03 CEST 2010


Simon Urbanek <simon.urbanek at r-project.org> writes:

> On Oct 24, 2010, at 4:21 PM, Vitalie S. wrote:
>
>> David Winsemius <dwinsemius at 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.
>

Oh,  that was really stupid from my part. I meant that functionality for my
specific class, not for lists of course.

For list I would expect, 

`$<-`(tl, tv[[1]], "sdfdsfdsfsd")
 tl$`tv[[1]]` <- "sdfdsfdsfsd"

to give the same result.

I just gave this artificial example with lists to illustrate the error. Didn't
want to bring the definition of my classes here.

Vitalie.

> 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 at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel> 
>> 



More information about the R-devel mailing list