假设我有一个foo
类的类似列表的对象,并且我想为它实现赋值操作符。该类与普通列表的不同之处在于,每个元素都使用"bar_"
前缀命名(这只是一个虚构的示例)。所以我对赋值操作符的简单实现是:
"[<-.foo" <- function(x, i, value) {
x[paste0("bar_", i)] <- value
}
显然,这是行不通的,因为它进入了无限循环:
as.foo <- function(x) {
names(x) <- paste0("bar_", names(x))
class(x) <- c(class(x), "foo")
x
}
x <- as.foo(list(a = 1, b = 2))
x["a"] <- 42
## Error: C stack usage 7970836 is too close to the limit
实现这种方法的最佳实践是什么?
发布于 2017-08-21 11:28:28
子集/子分配函数是特殊的,因为在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
}
顺便说一句,我会重写as.foo
as.foo <- function(x) {
stopifnot(is.list(x))
names(x) <- paste0("bar_", names(x))
class(x) <- c("foo", attr(x, "class"))
x
}
这避免了向class属性添加隐式类。
https://stackoverflow.com/questions/45795521
复制