[R] [FORGED] Re: identical() versus sapply()

Paulson, Ariel apa at stowers.org
Tue Apr 12 02:25:09 CEST 2016


Hi Jeff,


We are splitting hairs because R is splitting hairs, and causing us problems.  Integer and numeric are different R classes with different properties, mathematical relationships notwithstanding.  For instance, the counterintuitive result:


> identical(as.integer(1), as.numeric(1))
[1] FALSE


Unfortunately the reply-to chain doesn't extend far enough -- here is the original problem:


> sapply(1, identical, 1)
[1] TRUE

> sapply(1:2, identical, 1)
[1] FALSE FALSE

> sapply(1:2, function(i) identical(as.numeric(i),1) )
[1]  TRUE FALSE

> sapply(1:2, function(i) identical(as(i,"numeric"),1) )
[1] FALSE FALSE

These are the results of R's hair-splitting!

Ariel

________________________________
From: Jeff Newmiller <jdnewmil at dcn.davis.ca.us>
Sent: Monday, April 11, 2016 6:49 PM
To: Bert Gunter; Paulson, Ariel
Cc: Rolf Turner; r-help at r-project.org
Subject: Re: [R] [FORGED] Re: identical() versus sapply()

Hypothesis regarding the thought process: integer is a perfect subset of numeric, so why split hairs?
--
Sent from my phone. Please excuse my brevity.

On April 11, 2016 12:36:56 PM PDT, Bert Gunter <bgunter.4567 at gmail.com> wrote:

Indeed!

Slightly simplified to emphasize your point:

 class(as(1:2,"numeric"))
[1] "integer"

 class(as.numeric(1:2))
[1] "numeric"

whereas in ?as it says:

"Methods are pre-defined for coercing any object to one of the basic
datatypes. For example, as(x, "numeric") uses the existing as.numeric
function. "

I suspect this is related to my ignorance of S4 classes (i.e. as() )
and how they relate to S3 classes, but I certainly don't get it
either.

Cheers,
Bert



Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things
into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Mon, Apr 11, 2016 at 9:30 AM, Paulson, Ariel <apa at stowers.org> wrote:
 Ok, I see the difference between 1 and 1:2, I'll just leave it as one of those "only in R" things.

 But it seems then, that as.numeric() should guarantee a FALSE outcome, yet it does not.

 To build on what Rolf pointed out, I would really love for someone to explain this one:

 str(1)
  num 1

 str(1:2)
  int [1:2] 1 2

 str(as.numeric(1:2))
  num [1:2] 1 2

 str(as(1:2,"numeric"))
  int [1:2] 1 2

 Which doubly makes no sense.  1) Either the class is "numeric" or it isn't; I did not call as.integer() here.  2) method of recasting should not affect final class.

 Thanks,
 Ariel


 -----Original Message-----
 From: Rolf Turner [mailto:r.turner at auckland.ac.nz]
 Sent: Saturday, April 09, 2016 5:27 AM
 To: Jeff Newmiller
 Cc: Paulson, Ariel; 'r-help at r-project.org'
 Subject: Re: [FORGED] Re: [R] identical() versus sapply()

 On 09/04/16 16:24, Jeff Newmiller wrote:
 I highly
recommend making friends with the str function. Try

 str( 1 )
 str( 1:2 )

 Interesting.  But to me counter-intuitive.  Since R makes no distinction between scalars and vectors of length 1 (or more accurately I think, since in R there is *no such thing as a scalar*, only a vector of length
 1) I don't see why "1" should be treated in a manner that is categorically different from the way in which "1:2" is treated.

 Can you, or someone else with deep insight into R and its rationale, explain the basis for this difference in treatment?

 for the clue you need, and then

 sapply( 1:2, identical, 1L )

 cheers,

 Rolf

 --
 Technical Editor ANZJS
 Department of Statistics
 University of Auckland
 Phone: +64-9-373-7599 ext. 88276

________________________________

 R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
 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