From wdunlap at tibco.com  Wed Jul 24 17:38:58 2013
From: wdunlap at tibco.com (William Dunlap)
Date: Wed, 24 Jul 2013 15:38:58 +0000
Subject: [Rd] cbind error with check.names
In-Reply-To: <1374601659.38463.YahooMailNeo@web160105.mail.bf1.yahoo.com>
References: <1374585525.97733.YahooMailNeo@web160105.mail.bf1.yahoo.com>
	<CA+vqiLGkncU6QZm0CqBs+PbbXzFuGnzWvOOfrVqN9mUc4kttpQ@mail.gmail.com>
	<1374598453.74044.YahooMailNeo@web160105.mail.bf1.yahoo.com>
	<CA+vqiLHmAC2n-5kUTS+J09O8BzEvikLEyK+v2i3Kv3ffGGn2KA@mail.gmail.com>
	<1374601659.38463.YahooMailNeo@web160105.mail.bf1.yahoo.com>
Message-ID: <E66794E69CFDE04D9A70842786030B931C328CF0@PA-MBX01.na.tibco.com>

> I meant what is the design principle behind check.names being hardcoded to FALSE.
> I see no conflict with the purpose of cbind from the ability to specify check.names
> at the level of cbind.

One rationale is that data.frame(check.names=TRUE,...) does two things: it makes
sure there are no duplicate names and it makes sure that all the names are syntactic
names.  If you have created a data.frame with non-syntactic names you would be annoyed
if a call to cbind mangled its names, hence cbind.data.frame sets check.names=FALSE
to avoid this.
  > d1 <- data.frame(`Mass (g)`=102, `Conc (% by vol.)`=0.23, check.names=FALSE)
  > d2 <- data.frame(`Accel (m/s/s)`=9.81, `Conc (% by vol.)`=0.23, check.names=FALSE)
  > names(d1)
  [1] "Mass (g)"         "Conc (% by vol.)"
  > names(d2)
  [1] "Accel (m/s/s)"    "Conc (% by vol.)"
  > names(data.frame(d1, d2, check.names=TRUE))
  [1] "Mass..g."           "Conc....by.vol.."   "Accel..m.s.s."      "Conc....by.vol...1"
  > names(data.frame(d1, d2, check.names=FALSE))
  [1] "Mass (g)"         "Conc (% by vol.)" "Accel (m/s/s)"    "Conc (% by vol.)"
  > names(cbind(d1, d2))
  [1] "Mass (g)"         "Conc (% by vol.)" "Accel (m/s/s)"    "Conc (% by vol.)"

Perhaps data.frame() should throw an error if there are duplicate names,
or perhaps it should have a separate argument to say what to do about duplicate names,
but changing that sort of thing now would break a fair bit of code.  Perhaps
cbind.data.frame should not call data.frame, but copy the work that data.frame
does or perhaps it should check for duplicate names on the output of data.frame().
Is it worth the time to do that?

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

> -----Original Message-----
> From: r-devel-bounces at r-project.org [mailto:r-devel-bounces at r-project.org] On Behalf
> Of Fg Nu
> Sent: Tuesday, July 23, 2013 10:48 AM
> To: Ista Zahn
> Cc: r-devel at r-project.org
> Subject: Re: [Rd] cbind error with check.names
> 
> 
> 
> > Is there then a reason that overriding the check.names default is forbidden from cbind?
> I can't tell why this would be the case.
> 
> For the same reason you can't have
> 
> data.frame(x=1:10, x=11:20, check.names=TRUE, check.names=FALSE)
> 
> or
> 
> mean(x=1:10, x=11:20)
> 
> i.e, you can't generally pass the same argument more than once. There
> are exceptions to this, e.g.,
> 
> sum(c(NA, 1:10), na.rm=TRUE, na.rm=FALSE)
> 
> but in general each argument can only be matched once. Since
> cbind.data.frame calls data.frame with check.names=FALSE, you can't
> supply it again.
> 
> Best,
> Ista
> 
> >
> > Thanks
> >
> 
> 
> 
> Yikes, no. As I mentioned to the SO poster, I get that bit.
> 
> I meant what is the design principle behind check.names being hardcoded to FALSE. I see
> no conflict with the purpose of cbind from the ability to specify check.names at the level
> of cbind.
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] cbind error with check.names
William Dunlap