[R] dimnames in an array(I'll be grateful if this message will be passed to all list users)

William Dunlap wdunlap at tibco.com
Fri Aug 17 17:28:19 CEST 2012


Have you showed us how to reproduce your original problem?
Have you showed us the output of traceback() after encountering
the error?  Have you tried setting options(error=recover) before
encountering the error and then using recover() to look at the dimensions
and dimnames of the array that caused the problem?

This error message
> >                   Error in `colnames<-`(`*tmp*`, value = c("V", "R")) :
> >                   length of 'dimnames' [2] not equal to array extent
comes from a nested replacement operation.  One such such case is
     mat <- matrix(1:6,nrow=2,ncol=3)
     colnames(mat)[1:2] <- c("V", "R")
where the nested replacement gets expanded into
     tmp <- colnames(mat) # tmp becomes NULL
     tmp[1:2] <- c("V", "R") # tmp becomes c("V","R"), length is 2
     colnames(tmp) <- tmp # error: 2 colnames for 3 columns
(R uses `*tmp*` where I used tmp - the former is for internal use only.)

There are lots of other possibilities, but you need to at least show the
output of traceback() to pin it down.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of aleksandr shfets
> Sent: Friday, August 17, 2012 6:25 AM
> To: R. Michael Weylandt
> Cc: r-help at r-project.org
> Subject: Re: [R] dimnames in an array(I'll be grateful if this message will be passed to all
> list users)
> 
> 
> Michael,
> Thank you for suggestions;
> it seems to me that there's a fundamental lacuna with respect to names of a three
> dimensional array:
> that is, rownames fits dimension 1, colnames fits another dimension(that is, 3, if I read it
> correctly),
> but there is no specific name for the third dimension. I've tried "setnames" thinking that
> this would be appropriate
> for naming the sets, but there is no such R function.
> 
> On the other hand you're right, the suggestion
>              dimnames(data11a)[[2]]=c("V","R")
> 
> doesn't ameliorate the analysis: while now dimnames(data11a)[[2]]
> 
> comes out as
> [2]
> 
> returning to the original analysis the same error comes up, that is, that the length of
> dimnames[2] doesn't agree with thee.
> 'array extent' -- that is, even though the boxcar contents are two in number, it evaluates
> the analysis on the basis of the
> dimnames(data11a)[2] value.
> 
> I'm using colloc infer (available under R 2.14) and trying to do the FHN(FitzHugh Nagumo)
> analysis in section 9.1 of the manual; it's very complex work, but I doubt the program is
> in error.
> 
> It seems to me in any case that, if R demands that the length of 'dimnames[2] must be
> equal to the array extent, then there must be a way to make the length of the names
> equal to the extent of the array, am I right?
> Otherwise R would be inconsistent with itself, like Nomad on Startrek, and I've never
> seen a case where it was thus.
> 
> This is again why I ask if others with extensive experience with dimnames of an array
> have seen anything similar.
> Certainly someone might know what is the significance of the dimnames of the array,
> how much can the length of them be altered for use generally?
> 
> regards,
> A
> Thu, 16 Aug 2012 00:00:35 -0400 от "R. Michael Weylandt"
> <michael.weylandt at gmail.com>:
> >
> >
> >
> 
> 
> >
> 
> 
> 
> >On Wed, Aug 15, 2012 at 3:57 AM, aleksandr shfets <a_shfets at mail.ru> wrote:
> >
> > Hi Michael,
> >
> > Thanks for help on double brackets: I wasn't aware of this use of them.
> >
> >
> >
> > I went back to readjust my array so the dimnames(data11a)[[2]] would have
> >
> > two elements, and remade the array to include the new dimnames:
> >
> >
> >
> > dimnames(data11a)[[2]]=c("V","R")
> >
> >
> >
> > so that inside the second car of the train would
> >
> > be two items?
> >
> >
> Yes.
> >
> >
> >
> >
> > There seems to be no way to define dimnames(data11a)[2] to be two elements
> >
> > rather than one[as you say we have no way to combine the elements of the
> >
> > train except using the train].
> >
> >
> You could do this:
> >
> >
> dimnames(data11a)[2] <- list(c("V","R"))
> >
> >
> but I'm not sure that's any clearer. To keep the metaphor rolling (get
> >
> it!), list() puts your stuff in a boxcar so now you can put it
> >
> directly on the train.
> >
> >
> > So having tried to do what I can to make the
> >
> > middle element of the list to two rather than one, I rerun the analysis with
> >
> > the same result.
> >
> >
> >
> > if I read the thing right, regardless of how I define the "inside" of the
> >
> > boxcar, the analysis that I referred to
> >
> >
> >
> >                  res11a = inneropt(coefs, times=times, data=data11a,
> >
> > lik=lik,
> >
> >                  proc=proc, pars=spars, in.meth='nlminb',
> >
> > control.in=control.out)
> >
> >
> >
> >
> Where is this inneropt function from? It could be an error in that. If
> >
> it's from a package, give me the name and I'll take a look at it and
> >
> you can also contact the maintainer: get contact info using the
> >
> maintainer() function.
> >
> >
> Also, some of the advice here will probably be helpful  in seeking follow-up:
> >
> >http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-
> example
> >
> >
> Cheers,
> >
> Michael
> >
> >
> > still won't look at the 'contents' of the car, but gives the same message:
> >
> >
> >
> >                   Error in `colnames<-`(`*tmp*`, value = c("V", "R")) :
> >
> >                   length of 'dimnames' [2] not equal to array extent
> >
> >
> >
> >
> >
> > I've tried a couple of other things like, after defining the second boxcar
> >
> > as:
> >
> >
> >
> >                   dimnames(data11a)[[2]]=c("V","R")
> >
> >
> >
> >
> >
> > then
> >
> >
> >
> >
> >
> >                    dimnames(data11a)[2]=list(dimnames(data11a)[[2]])
> >
> >
> >
> >
> >
> > but this last generates an error.
> >
> >
> >
> > Somehow I think that that the clue to the thing is in the error message:
> >
> > what I see[ with my untrained eye] is that there should be some way to
> >
> > reconcile the three-- colnames, dimnames and the array- to a greater degree
> >
> > than their present agreement.
> >
> > Am I right?
> >
> > regards,
> >
> > Russell
> >
> >
> >
> > Tue, 14 Aug 2012 01:27:50 -0400 от "R. Michael Weylandt"
> >
> > <michael.weylandt at gmail.com>:
> >
> >
> >
> > On Mon, Aug 13, 2012 at 5:10 AM, aleksandr russell <sss736 at gmail.com> wrote:
> >
> >> Hello,
> >
> >>
> >
> >> I'm hoping someone with a wide experience with R may be able to see
> >
> >> what the program is trying to tell me.
> >
> >>
> >
> >> I've got an array:
> >
> >>
> >
> >> y1=rnorm(41,0.2)
> >
> >> y2=rnorm(41,0.2)
> >
> >> y3=rbind(y1,y2)
> >
> >>
> >
> >>
> >
> >>
> >
> >> data11<-array(0,c(41,2,2))
> >
> >> data11[,1,]=y3
> >
> >> data11[,2,]=y3
> >
> >> rownames(data11)<-rownames(data11, do.NULL = FALSE, prefix = "Obs.")
> >
> >> colnames=c("V","R")
> >
> >> varnames=c("one","two")
> >
> >> dimnames(data11)<-list(rownames(data11), varnames, colnames)
> >
> >>
> >
> >>
> >
> >>
> >
> >> data11a<-as.array(data11, dimnames=dimnames(data11))
> >
> >
> >
> > # No effect here
> >
> >  identical(data11, data11a) # TRUE
> >
> >
> >
> >>
> >
> >> The analysis that I would like to do with R(CollocInfer) runs as
> >
> >> follows(I print for the sake of introduction here though to run this
> >
> >> line of code requires extensive setup)
> >
> >>
> >
> >> res11a = inneropt(coefs, times=times, data=data11a, lik=lik,
> >
> >> proc=proc, pars=spars, in.meth='nlminb', control.in=control.out)
> >
> >>
> >
> >>
> >
> >>
> >
> >> The response I get is
> >
> >>
> >
> >> Error in 'colnames<-'('*tmp*', value = c("V","R")) :
> >
> >> length of 'dimnames' [2] not equal to array extent
> >
> >>
> >
> >>
> >
> >>
> >
> >> It seems to me that there is a fundamental match of 'dimnames' with
> >
> >> the array that is being referred to.
> >
> >>
> >
> >> I have learned that the normal length of dimnames for an array is one
> >
> >> for each element in the list: thus as I've set up the array, the
> >
> >> length(dimnames(data11a)[2]) gives me
> >
> >>
> >
> >> [1]
> >
> >
> >
> > I believe you are looking for
> >
> >
> >
> > length(dimnames(data11a)[[2]]) # 2
> >
> >
> >
> > Look into the difference between `[` and `[[` for subsetting a list.
> >
> > See ?Extract for the gorey details, but I like my little train
> >
> > metaphor:
> >
> >
> >
> > If the list "x", is a train: x[2] is the "sub-train" consisting only
> >
> > of the second car, while x[[2]] is the contents of that second car.
> >
> > Hence we can do x[1:3] to give a well defined train, but not x[[1:3]]
> >
> > because we have no way to combine the elements of the first three cars
> >
> > other than using a train.
> >
> >
> >
> > Cheers,
> >
> > Michael
> >
> >
> >
> >>
> >
> >> I would like to ask :Is it not evident from R's response that there is
> >
> >> some other possibility for the dimnames[2] of the array?
> >
> >>
> >
> >> If so, what is it?
> >
> >>
> >
> >> regards,
> >
> >> A
> >
> >>
> >
> >> ______________________________________________
> >
> >> R-help at 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.
> >
> >
> >
> >
> >
> 
> 
> 
> 
> 
> 
> 
> 	[[alternative HTML version deleted]]



More information about the R-help mailing list