[Rd] "$<-" fails (invalid subscript type 'language')
Simon Urbanek
simon.urbanek at r-project.org
Mon Oct 25 15:00:35 CEST 2010
On Oct 25, 2010, at 3:51 AM, Vitalie S. wrote:
> 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.
>
Nope, you're passing different arguments - to make them equivalent you have to use
`$<-`(tl, `tv[[1]]`, "sdfdsfdsfsd")
which works -- you need to quote the symbol in both cases not just one ;).
Cheers,
Simon
> 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