2

我想在 R 中有一些初始化替换方法,我可以在没有赋值运算符的情况下调用它们。

例如:

我希望能够调用setNode(o)和替换对象 o 中的插槽,而不必调用类似setnode(o) <- c("foo", "bar"). 我想这样做的原因是因为我希望在这些(即select.list)中有一些交互性,而该方法的用户不必知道分配的细节。

这可能吗?

4

1 回答 1

2

我不太了解您的用例,但是...语法如

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 用户感到困惑,因为他们期望更改时复制语义。

于 2012-01-30T19:54:09.310 回答