运算符重载在R包中停止工作

dud*_*udu 7 overloading r devtools r-s3

我有一个基本上是列表的容器类.因为我想支持子集化,所以我重载了子集[运算符(可能实现得很差).

#' 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
}
Run Code Online (Sandbox Code Playgroud)

现在,这在我的开发环境中(当我正在调试包时)按预期工作.也就是说,如果y_old是一个spectra对象,我做的y_new = y_old[-1],y_new仍然是一个spectra对象.

但是,当我将项目编译为包并安装它时,子集操作符返回一个list而不是一个spectra对象.

对于发生了什么的任何线索?

编辑

我忘了提到我正在使用RStudio和devtools库.

dud*_*udu 0

这个问题归结为当您选择创建包时,RStudio 对 NAMESPACE 的默认初始化。检查 NAMESPACE 文件显示:

exportPattern("^[[:alpha:]]+")
Run Code Online (Sandbox Code Playgroud)

[正如 MrFlick 指出的那样,这与子集运算符不匹配。

您可以手动将名称添加到 NAMESPACE,也可以让 RStudio 和 Roxygen 为您完成这项工作。在 RStudio 0.99.902 中,您将:

  1. install.packages("roxygen2")
  2. 在菜单Build >配置构建工具>构建工具中选中使用 Roxygen 生成文档
  3. 单击“配置”按钮并选中“命名空间文件”复选框。

现在,您显然必须将 Roxygen 文档添加到您的函数中,并记住使用@export标签,例如:

#' Print hi in R
#' @export
print_hi = function(x) print("hi")
Run Code Online (Sandbox Code Playgroud)

构建后,您应该有一个自动生成的 NAMESPACE 文件。例如:

# Generated by roxygen2: do not edit by hand

export(print_hi)
Run Code Online (Sandbox Code Playgroud)