From simon.urbanek at r-project.org  Sun Oct 24 22:47:02 2010
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Sun, 24 Oct 2010 16:47:02 -0400
Subject: [Rd] "$<-" fails (invalid subscript type 'language')
In-Reply-To: <87fwvv7355.fsf@gmail.com>
References: <cpnwrp7zs2t.fsf@gmail.com>
	<FB9D7384-795F-4EB1-8ABE-A1C1BD11977D@comcast.net>
	<87fwvv7355.fsf@gmail.com>
Message-ID: <D5C66B87-3C04-4AD1-9573-FC10DCCFD32B@r-project.org>


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.

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