R 为S3类实现提取和分配运算符的最佳方法

R 为S3类实现提取和分配运算符的最佳方法,r,R,假设我有一个类似列表的对象foo类,我想为它实现赋值操作符。该类与普通列表的不同之处在于,每个元素的名称都带有的“bar”前缀(这只是一个虚构的示例)。因此,我对assign operator的天真实现是: "[<-.foo" <- function(x, i, value) { x[paste0("bar_", i)] <- value } “[子集/子分配函数是特殊的,因为在R级别没有通用的和默认的方法。这些都是用C代码处理的。原因当然是性能:S3方法分配相对较慢,

假设我有一个类似列表的对象
foo
类,我想为它实现赋值操作符。该类与普通列表的不同之处在于,每个元素的名称都带有
的“bar”
前缀(这只是一个虚构的示例)。因此,我对assign operator的天真实现是:

"[<-.foo" <- function(x, i, value) {
   x[paste0("bar_", i)] <- value
}

“[子集/子分配函数是特殊的,因为在R级别没有通用的和默认的方法。这些都是用C代码处理的。原因当然是性能:S3方法分配相对较慢,而子集设置需要尽可能快,因为它使用得太多

我将暂时删除该类:

"[<-.foo" <- function(x, i, value) {
  theclass <- class(x)
  class(x) <- class(x)[-inherits(x, "foo", TRUE)]
  x[paste0("bar_", i)] <- value
  class(x) <- theclass
  x
}

这避免了将隐式类添加到class属性。

这就是我要做的,但看起来很难看,难道没有比这更好的方法吗?!对于大多数函数,您只需调用默认方法即可。但是,
[欢迎再次使用R inferno:]没有默认方法
"[<-.foo" <- function(x, i, value) {
  theclass <- class(x)
  class(x) <- class(x)[-inherits(x, "foo", TRUE)]
  x[paste0("bar_", i)] <- value
  class(x) <- theclass
  x
}
as.foo <- function(x) {
  stopifnot(is.list(x))
  names(x) <- paste0("bar_", names(x))
  class(x) <- c("foo", attr(x, "class"))
  x
}