运算符重载在 R 包中停止工作
Operator overload stops working in R package
我有一个基本上是列表的容器class。因为我想支持子集化,所以我重载了子集 [
运算符(可能实现不佳)。
#' 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
对象。
但是,当我将项目编译为一个包并安装它时,子集运算符 returns a list
而不是 spectra
对象。
有什么线索吗?
编辑
我忘了说我正在使用 RStudio 和 devtools
库。
这个问题归结为当你选择创建包时,RStudio 默认初始化了 NAMESPACE。检查 NAMESPACE 文件显示:
exportPattern("^[[:alpha:]]+")
正如 MrFlick 指出的那样,它与子集运算符 [
不匹配。
您可以手动将名称添加到 NAMESPACE,也可以让 RStudio 和 Roxygen 为您完成这项工作。在 RStudio 0.99.902 中你会:
install.packages("roxygen2")
- 在菜单 Build > Configure Build Tools > 构建工具.
- 单击 配置 按钮并选中 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)
我有一个基本上是列表的容器class。因为我想支持子集化,所以我重载了子集 [
运算符(可能实现不佳)。
#' 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
对象。
但是,当我将项目编译为一个包并安装它时,子集运算符 returns a list
而不是 spectra
对象。
有什么线索吗?
编辑
我忘了说我正在使用 RStudio 和 devtools
库。
这个问题归结为当你选择创建包时,RStudio 默认初始化了 NAMESPACE。检查 NAMESPACE 文件显示:
exportPattern("^[[:alpha:]]+")
正如 MrFlick 指出的那样,它与子集运算符 [
不匹配。
您可以手动将名称添加到 NAMESPACE,也可以让 RStudio 和 Roxygen 为您完成这项工作。在 RStudio 0.99.902 中你会:
install.packages("roxygen2")
- 在菜单 Build > Configure Build Tools > 构建工具.
- 单击 配置 按钮并选中 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)