首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作符过载在R包中停止工作

操作符过载在R包中停止工作
EN

Stack Overflow用户
提问于 2015-04-19 21:31:59
回答 1查看 343关注 0票数 7

我有一个容器类,它基本上是一个列表。因为我想支持子设置,所以我重载了子集[操作符(可能实现得很糟糕)。

代码语言:javascript
复制
#' 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库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-06 02:56:05

这个问题归结为当您选择创建包时RStudio默认的命名空间初始化。检查命名空间文件会发现:

代码语言:javascript
复制
exportPattern("^[[:alpha:]]+")

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

您可以手动将名称添加到命名空间,也可以让RStudio和RO2为您完成工作。在RStudio 0.99.902中,您可以:

  1. install.packages("roxygen2")
  2. 在菜单 Build > Configure Tools > Build Tools中检查使用RO2生成的文档。
  3. 单击配置按钮并选中命名空间文件复选框。

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

代码语言:javascript
复制
#' Print hi in R
#' @export
print_hi = function(x) print("hi")

生成之后,您应该有一个自动生成的命名空间文件。例如:

代码语言:javascript
复制
# Generated by roxygen2: do not edit by hand

export(print_hi)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29736122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档