Установить методы в R без присваивания - PullRequest
2 голосов
/ 30 января 2012

Я хотел бы иметь некоторые методы замены после инициализации в R, которые можно вызывать без оператора присваивания.

Так, например:

Я хотел бы иметь возможность вызывать setNode(o) и заменять слоты в объекте o без необходимости вызывать что-то вроде setnode(o) <- c("foo", "bar"). Причина, по которой я хочу это сделать, заключается в том, что я хочу, чтобы в них была некоторая интерактивность (т. Е. select.list), чтобы пользователь метода не знал подробности назначения.

Возможно ли это?

1 Ответ

2 голосов
/ 30 января 2012

Я не совсем понимаю ваш вариант использования, но ... синтаксис, такой как

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, ожидающих семантику копирования при изменении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...