On Mon, Mar 1, 2010 at 4:02 PM, Karl Ove Hufthammer <k...@huftis.org> wrote: > On Mon, 01 Mar 2010 09:09:11 -0500 Duncan Murdoch <murd...@stats.uwo.ca> > wrote: >> >> The reason for the difference is that data.frames are lists organized >> >> into columns (so the $ handling comes from the list, where it means >> >> "extract the component") whereas a matrix is a single vector displayed >> >> in columns. >> > >> > Sure, I know that. But is there are reason why the '$' can't be >> > overloaded to handle the extraction, as a *convenience* to the user? >> >> See the second paragraph of my response. > > OK. So I take it that there are no *technical* reasons can't be made to > work for matrices and named vectors? I tried redefining it for matrices > with > > `$.matrix`=function(x, name) ... something ... > > but I still get an error message when trying to use it. > > Of course I agree that 'the idea of a list is so fundamental to R that > it needs to be something learned pretty early', but is there any harm in > slightly 'blur[ing] the distinction between dataframes and matrices', as > a convenience to the user? Or, in other words, what does one *gain* by > having '$' on named matrices and vectors give a confusing error message > instead of the expected results? Dinstinction for dinstinction's own > sake is of little use. > > In case anyone is wondering about the vector case (of which matrices is > of course only a special case), here is an example: > >> d=iris[,1:4] >> d1=head(d,1) >> d2=mean(d) >> >> d1 > Sepal.Length Sepal.Width Petal.Length Petal.Width > 1 5.1 3.5 1.4 0.2 >> d2 > Sepal.Length Sepal.Width Petal.Length Petal.Width > 5.843333 3.057333 3.758000 1.199333 >> >> d3$Sepal.Width > [1] 3.5 >> d4$Sepal.Width > Error in d4$Sepal.Width : $ operator is invalid for atomic vectors > > -- > Karl Ove Hufthammer >
As a technical excercise, I wrote the following function: '%W%'<-function(e1,e2)e1[,which(colnames(e1)%in%e2)] temp<-matrix(1:6,nrow=2,dimnames=list(a=1:2,b=c("a","b","c"))) temp%W%"b" I assume that the reason you can't use $.matrix , is that $ is a primitive function and doesn't use the UseMethod function. /Gustaf -- Gustaf Rydevik, M.Sci. tel: +46(0)703 051 451 address:Essingetorget 40,112 66 Stockholm, SE skype:gustaf_rydevik ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.