【发布时间】:2015-06-26 11:37:10
【问题描述】:
我有一个容器类,它基本上是一个列表。因为我想支持子集,所以我重载了子集[ 运算符(可能实现得很差)。
#' Constructor for spectra object
.spectra = function(n_spectrum = 0) {
object = vector(mode = "list", n_spectrum)
class(object) = "spectra"
return(object)
}
#' Operator overload
#' @export
`[.spectra` = function(x, i) {
x = unclass(x)
x = x[i] # Using the list's subset function
class(x) = "spectra"
return(x) # Should return a "spectra" object, not a list
}
现在,这在我的开发环境中(当我调试包时)可以正常工作。也就是说,如果y_old 是spectra 对象,而我是y_new = y_old[-1],y_new 仍然是spectra 对象。
但是,当我将项目编译为一个包并安装它时,子集运算符返回一个list 而不是spectra 对象。
有什么线索吗?
编辑
我忘了提到我正在使用 RStudio 和 devtools 库。
【问题讨论】:
-
你的包的
NAMESPACE文件中有S3method("[",spectra)的一行吗? -
@nicola 没有。我在
NAMESPACE中的唯一 行是exportPattern("^[[:alpha:]]+"),我猜这就是RStudio 放在那里的。 -
放那行,重建包,看看它是否有效。
-
@nicola 这确实有效,但我很好奇为什么这是唯一不会自动导出的函数。
-
它与
exportPattern("^[[:alpha:]]+")中的模式不匹配。这会寻找以字母开头的函数。这个特殊的函数以 "["
标签: r overloading devtools r-s3