В комментарии @Alexis упоминаются классы R6.В то время как меня просили к классам S4 для моего текущего проекта (нацеленного на BioConductor), следующее предложение из документов R6 ReferenceClasses привлекло мое внимание: «Справочные классы реализованы как классы S4 с частью данных типа« environment ». '
Так что, если я действительно хочу, чтобы изменяемые элементы при использовании классов S4, я мог эмулировать R6 следующим образом:
setClass("A", representation(inMutable = "ANY",
.env = "environment"))
A = function(inMutable = NULL, mutable = NULL) {
x <- new("A",
inMutable = inMutable,
.env = new.env())
x@.env$mutable = mutable
x@inMutable <- inMutable
x
}
setGeneric("inMutable<-", function(x, value) standardGeneric("inMutable<-"))
setGeneric("inMutable", function(x) standardGeneric("inMutable"))
setGeneric("mutable<-", function(x, value) standardGeneric("mutable<-"))
setGeneric("mutable", function(x) standardGeneric("mutable"))
#setter
setMethod("inMutable<-", signature("A", "numeric"),
function(x, value)
{
x@inMutable <- value
x
})
#getter
setMethod("inMutable", signature("A"),
function(x)
{
if (!length(x@inMutable))
message("Hmmm, you haven't initialized a value for 'inMutable'.",
" I'm afraid I can't do anything about that now.")
x@inMutable
})
#setter
setMethod("mutable<-", signature("A", "numeric"),
function(x, value)
{
x@.env$mutable <- value
x
})
#getter (mutable!)
setMethod("mutable", signature("A"),
function(x)
{
if (!length(x@.env$mutable)) {
message("Ah. You haven't initialized a value for 'mutable'. ",
"Lucky for you I can initialize it for you now.")
x@.env$mutable = 12
}
x@.env$mutable
})
Тогда я могу сделать это:
> a <- A()
> mutable(a)
Ah. You haven't initialized a value for 'mutable'.
Lucky for you I can initialize it for you now.
[1] 12
> mutable(a)
[1] 12
>
> inMutable(a)
Hmmm, you haven't initialized a value for 'inMutable'.
I'm afraid I can't do anything about that now.
NULL
> inMutable(a) <- 18
> inMutable(a)
[1] 18
>
Очевидно, ссылкаКлассы и R6 обеспечивают гораздо более богатое и надежное решение, но в крайнем случае это кажется жизнеспособным вариантом S4.Конечно, я не проверил это полностью в дикой природе, чтобы увидеть, где оно может сломаться.