我想在 R 中有一些初始化替换方法,我可以在没有赋值运算符的情况下调用它们。
例如:
我希望能够调用setNode(o)
和替换对象 o 中的插槽,而不必调用类似setnode(o) <- c("foo", "bar")
. 我想这样做的原因是因为我希望在这些(即select.list
)中有一些交互性,而该方法的用户不必知道分配的细节。
这可能吗?
我不太了解您的用例,但是...语法如
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 用户感到困惑,因为他们期望更改时复制语义。