UUIDgenerate() без класса s4 создает один и тот же uuid в каждом экземпляре

Когда я создаю новый экземпляр S4 класс в R, я хотел бы, чтобы вновь созданный объект имел уникальный id поле. Я пытаюсь добиться этого через UUIDgenerate() от uuid пакет. Проблема в том, что я получаю то же самое 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"

призвание UUIDgenerate() последовательно в командной строке R производит разные UUIDS каждый раз.

Где я могу пойти не так?

Спасибо

2 ответа

Решение

Получил очень хорошее решение от Бена Таппера в списке R-help. Определение функции "initialize" решает проблему еще проще:

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

Происходит то, что призыв к UUIDgenerate оценивается при запуске setClass утверждение, а не когда вы используете new, Это не имеет ничего общего с 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))
}

Это должно создавать новый объект класса "C" каждый раз с другим UUID.

Другие вопросы по тегам