From simon.urbanek at r-project.org  Mon Oct 25 15:00:35 2010
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Mon, 25 Oct 2010 09:00:35 -0400
Subject: [Rd] "$<-" fails (invalid subscript type 'language')
In-Reply-To: <87zku26788.fsf@gmail.com>
References: <cpnwrp7zs2t.fsf@gmail.com>
	<FB9D7384-795F-4EB1-8ABE-A1C1BD11977D@comcast.net>
	<87fwvv7355.fsf@gmail.com>
	<D5C66B87-3C04-4AD1-9573-FC10DCCFD32B@r-project.org>
	<87zku26788.fsf@gmail.com>
Message-ID: <6F3C1489-1DB9-4C14-A4E3-67117602F93B@r-project.org>


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> 
>>> 
> 
> 



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