Я не совсем понимаю ваш вариант использования, но ... синтаксис, такой как
o <- setNode(o, c("foo", "bar"))
, если вы не пройдете искажения, будет следовать обычным правилам копирования при изменении Rи сделайте копию o
вместо замены значений слотов в o
.Методы замены
node(o) <- c("foo", "bar")
обновление o
на месте.Я использую node
, а не setNode
, потому что настройка подразумевается при использовании.Ничто не говорит о том, что node<-
должен делать что-либо, связанное со структурой объекта, например
setClass("Node", representation(n="integer", value="character"),
prototype=prototype(n=0L))
setGeneric("node<-", function(x, ..., value) standardGeneric("node<-"))
setReplaceMethod("node", "Node", function(x, ..., value) {
x@n <- x@n + 1L
x@value <- toupper(value)
x
})
, а затем
> o <- new("Node")
> o
An object of class "Node"
Slot "n":
[1] 0
Slot "value":
character(0)
> node(o) <- c("foo", "bar")
> o
An object of class "Node"
Slot "n":
[1] 1
Slot "value":
[1] "FOO" "BAR"
Я не уверен, как это относится кваше желание "я хочу, чтобы была какая-то интерактивность";Вы могли бы написать код, который имел бы более похожий на вызов синтаксис, такой как
> do.call("node<-", list(x=o, value=c("foo", "bar")))
An object of class "Node"
Slot "n":
[1] 2
Slot "value":
[1] "FOO" "BAR"
, но это ничем не отличается от node(o) <- ...
.
Выберите ссылочный класс (это сборкаповерх S4, поэтому применяются S4-измы, такие как setOldClass
), если это соответствует содержанию класса, а не предоставленному интерфейсу.Например, соединение с базой данных может быть подходящим для эталонного класса, потому что на диске есть только один объект, с которым вы взаимодействуете;в основном, использование ссылочных классов сбивает с толку ваших пользователей R, ожидающих семантику копирования при изменении.