【问题标题】:Operator overload stops working in R package运算符重载在 R 包中停止工作
【发布时间】: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_oldspectra 对象,而我是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


【解决方案1】:

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

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

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

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

  1. install.packages("roxygen2")
  2. 在菜单Build > Configure Build Tools > Build Tools中检查Generate documentation with Roxygen。。李>
  3. 单击配置按钮并选中NAMESPACE文件复选框。

现在您显然必须将 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多