2016-06-08 38 views
1

当我在R中创建一个S4类的新实例时,我希望新创建的对象具有唯一的id字段。我试图通过uuid包中的UUIDgenerate()来实现它。的问题是,我获得相同UUID在每个新对象实例:UUIDgenerate()与一个s4类在每个实例中产生相同的uuid

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" 

在R命令行调用UUIDgenerate()依次产生每次不同UUIDS

我到哪里去了?

感谢

回答

1

得到了本·塔珀R-帮助列表上了很好的解决。定义“初始化”功能可以更加清晰地解决问题:

setMethod("initialize", "C", 
     function(.Object){ 
      [email protected] = UUIDgenerate(use.time = TRUE) 
      .Object 
     }) 
1

正在发生的事情是,当你运行setClass语句,而不是当您使用newUUIDgenerate呼叫评估。它无关UUIDgenerate本身 - 例如此类行为将依据sys.time单独时相同:

setClass("D", 
     representation=representation(
      id = "character" 
     ), 
     prototype = prototype(
      id = as.character(Sys.time())) 
) 

为了得到你想要的,你可以编写创建“C”类的对象的功能是什么像这样:

NewC<-function(){ 
    new("C", id=UUIDgenerate(use.time = TRUE)) 
} 

这应该每次使用不同的UUID创建类“C”的新对象。

+0

没错。谢谢。 – Servet

相关问题