[R] UUIDgenerate() withn a s4 class produces the same uuid at each instance

Ben Tupper btupper at bigelow.org
Wed Jun 8 16:22:06 CEST 2016


Hi,

I think your issue is that in the absence of an explicit 'initialize' method the value of id is assigned when you define the class prototype.  All subsequent new instances will use that very same prototype value defined when you first defined the class.  That's in the help for ?new, "The function new begins by copying the prototype object from the class definition."  Read on in the details section to learn more about 'initialize'.

To get a new id for each new object instance you can define an 'initialize' method.

setMethod("initialize",
          "C",
          function(.Object){
              .Object at id = UUIDgenerate(use.time = TRUE)
              .Object
          })

> new("C")
An object of class "C"
Slot "id":
[1] "f5e87504-2d83-11e6-9dcb-685b35bcefe9"

> new("C")
An object of class "C"
Slot "id":
[1] "f73cf010-2d83-11e6-9dcb-685b35bcefe9"

> new("C")
An object of class "C"
Slot "id":
[1] "f8321f22-2d83-11e6-9dcb-685b35bcefe9"

> new("C")
An object of class "C"
Slot "id":
[1] "f96e3c90-2d83-11e6-9dcb-685b35bcefe9"


There may be other ways to achieve the same outcome.   Caveat... I handy with Reference Classes (see ?setRefClass) but have only recently exploring S4 classes.

Cheers,
Ben

> On Jun 8, 2016, at 8:24 AM, Servet Ahmet Çizmeli <Servet.Ahmet.Cizmeli at USherbrooke.ca> wrote:
> 
> 
> 
> Hello 
> 
> When I create a new instance of an S4 class in R, I would like the newly
> created object to have a unique id field. I try to achieve it through
> UUIDgenerate() from the uuid package. The problem is that I obtain the
> same UUID at every new object instance : 
> 
> library(uuid)
> setClass("C",
> representation=representation(
> id = "character"
> ),
> prototype = prototype(
> id = UUIDgenerate(use.time = TRUE))
> )
> 
> new("C")
> 
> An object of class "C" Slot "id": [1]
> "1e07d7c2-2d71-11e6-b5e1-e1f59d8ccf09" 
> 
> new("C")
> 
> An object of class "C" Slot "id": [1]
> "1e07d7c2-2d71-11e6-b5e1-e1f59d8ccf09" 
> 
> new("C")
> 
> An object of class "C" Slot "id": [1]
> "1e07d7c2-2d71-11e6-b5e1-e1f59d8ccf09" 
> 
> Calling UUIDgenerate() successively at the R command line produces
> different UUIDS each time. 
> 
> Where do I go wrong? 
> 
> Thanks 
> 
> Servet 
> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> 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.

Ben Tupper
Bigelow Laboratory for Ocean Sciences
60 Bigelow Drive, P.O. Box 380
East Boothbay, Maine 04544
http://www.bigelow.org

Report Gulf of Maine jellyfish sightings to jellyfish at bigelow.org or tweet them to #MaineJellies -- include date, time, and location, as well as any descriptive information such as size or type.  Learn more at https://www.bigelow.org/research/srs/nick-record/nick-record-laboratory/mainejellies/



More information about the R-help mailing list