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

时间:2015-04-19 21:32:00

标签: r overloading 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
}

现在,在我的开发环境中(当我调试包时),这可以正常工作。也就是说,如果y_oldspectra对象而我y_new = y_old[-1]y_new仍然是spectra对象。

但是,当我将项目编译为包并安装时,子集运算符会返回list而不是spectra对象。

有关正在发生的事情的任何线索?

修改

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

1 个答案:

答案 0 :(得分:0)

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

exportPattern("^[[:alpha:]]+")

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

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

  1. install.packages("roxygen2")
  2. 在菜单构建>中选中使用Roxygen生成文档 配置构建工具> 构建工具
  3. 点击配置按钮,然后选中 NAMESPACE文件复选框。
  4. 现在你显然必须在你的函数中添加Roxygen文档,并记得使用@export标记,例如:

    #' Print hi in R
    #' @export
    print_hi = function(x) print("hi")
    

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

    # Generated by roxygen2: do not edit by hand
    
    export(print_hi)