我正在研究一个自定义R6Class
,它将成为我的 R 包的主要结构。但问题在于:
setMethod('+', signature("MyClass"), function(e1, e2)1)
或者
setMethod('+', signature("R6"), function(e1, e2)1)
不工作,因为当我跑步时
a = MyClass$new()
a + a
我收到以下错误 Error in a + a : non-numeric argument to binary operator
我让它工作的唯一方法是这样的
`+.MyClass` = function(e1, e2) { return (1) }
但这没有用,因为未定义library(MyClass)
在空环境中从头开始 ( )加载包时+.MyClass
。
那么,如何以正确的方式重载 R6 类的运算符呢?
以防万一,片段:
MyClass = R6Class(
"MyClass",
public = list(
initialize = function() {
}
),
private = list(
)
)
setMethod('+', signature("MyClass"), function(e1, e2)1)
a = MyClass$new()
a+a
当你加载包时,+.MyClass
应该绝对可用,假设你已经导出了函数。1
我可以用一个最小的例子来证明这一点,我使用了它devtools
——我不能推荐足够的使用 devtools 来创建包。首先,我创建了一个最小的包结构:
devtools::create("dummypack", rstudio = FALSE)
然后我在“dummypack/R/”文件夹中添加一个 R 文件,“MyClass.R”:
#' @export
MyClass = R6::R6Class(
"MyClass",
public = list(
initialize = function() {
}
),
private = list(
)
)
#' @export
`+.MyClass` = function(e1, e2) { return (1) }
#' @export
这里的标签很关键;2要使此功能可用,您需要将其导出到“dummypack/NAMESPACE”文件中(请参阅Hadley Wickham 的 R 包的命名空间章节)。你需要你的 NAMESPACE 文件看起来像
export(MyClass)
export(`+.MyClass`)
以确保这两个类和重载+
运营商出口。或者你可以有一个 NAMESPACE 像
exportPattern("^[^\\.]")
导出所有不以 a 开头的内容.
(这是最初由 生成的 NAMESPACE 文件devtools::create()
)。因此,如果您不使用devtools
(和 Roxygen -- roxygen2
),则需要自己编辑 NAMESPACE 文件以确保导出您的函数。
然后我跑
devtools::install("dummypack/")
在新的 R 会话中,我运行:
library(dummypack)
a = MyClass$new()
a+a
# [1] 1
表明你得到了你想要的结果。
2请注意,这些标签仅在您使用 Roxygen 时对您的 NAMESPACE 文件有帮助(如果您使用的是devtools::document()
)。此外,对于我展示的最小示例,标签在技术上不是必需的,因为由 生成的默认 NAMESPACEdevtools::create()
只包含exportPattern("^[^\\.]")
上面讨论的行。但是,在典型的情况下,您需要这些标签,无论哪种方式,重要的是 NAMESPACE 文件中的内容——您需要export()
NAMESPACE 中的显式语句或诸如exportPattern("^[^\\.]")
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句