R 中 R6 类的算术运算符重载

莱昂纳多摩托艇

我正在研究一个自定义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

表明你得到了你想要的结果。


1 我原以为这个问题很容易被标记为重复。这个问题是我发现的最接近的问题,但似乎有点过于针对 Roxygen。

2请注意,这些标签仅在您使用 Roxygen 时对您的 NAMESPACE 文件有帮助(如果您使用的是devtools::document())。此外,对于我展示的最小示例,标签在技术上不是必需的,因为由 生成的默认 NAMESPACEdevtools::create()只包含exportPattern("^[^\\.]")上面讨论的行但是,在典型的情况下,您需要这些标签,无论哪种方式,重要的是 NAMESPACE 文件中的内容——您需要export()NAMESPACE 中的显式语句或诸如exportPattern("^[^\\.]").

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R:如何重载+运算符来调用向R6类添加函数的方法?

来自分类Dev

R6类中的静态方法

来自分类Dev

R中%in%运算符的重载

来自分类Dev

R中的重载&运算符

来自分类Dev

在 R 包中包含 R6 类对象

来自分类Dev

更改R6类的子类中的Initialize方法

来自分类Dev

R6类内部定义:“未找到对象”(或:如何在R6类中定义“本地”对象)

来自分类Dev

在R中的R6类中测试私有方法

来自分类Dev

在R中的R6类中测试私有方法

来自分类Dev

在R中创建类:S3,S4,R5(RC)或R6?

来自分类Dev

R6初始化内的R6类的调用函数

来自分类Dev

R中的++运算符

来自分类Dev

R R6类和UseMethod /泛型方法

来自分类Dev

动态向r6类实例添加函数

来自分类Dev

从R6类访问包范围的变量

来自分类Dev

如何告诉R6类如何使用方括号?

来自分类Dev

运算符=模板类中的重载

来自分类Dev

R中%in%运算符的C ++版本

来自分类Dev

'|'如何 运算符在R中工作?

来自分类Dev

此R代码中的%>%或%。%运算符

来自分类Dev

R中的赋值运算符:“ <-”和“ <<-”

来自分类Dev

R中%in%运算符的C ++版本

来自分类Dev

R中的赋值运算符:“ <-”和“ <<-”

来自分类Dev

R中的双向赋值运算符

来自分类Dev

R:在R6中矢量化设置活动字段

来自分类Dev

R Shinyapp:renderUI不适用于嵌套模块R6类

来自分类Dev

R-算术不尊重逻辑非运算符和运算顺序?

来自分类Dev

R%*%运算符

来自分类Dev

R%*%运算符