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.