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

JBJ

我的目的是重载+运算符,以便在R6对象上调用方法这是一个带有R6类对象的玩具示例,该对象aclass具有一种add_function(foo)可以自行存储一些任意函数的方法

我希望将电话替代,以add_function(foo)通过+ foo在风格GGPLOT2的+ .gg或+(E1,E2) 我检查了ggplot2 github代码,但无法弄清楚。

这是一个R6对象,我们可以向其中添加任意功能

library(R6)
# The class (called aclass) looks like so:
Aclass <- R6Class("aclass",
  public = list(
    fun = NULL,
    x = NULL,
    initialize = function(x) {
      self$x <- x
      return(invisible(self))
    },
    # this is the function adding part
    add_fun = function(fun) {
      self$fun <- substitute(fun)
    },
    # and here we execute the functions
    do_fun = function() {
      return(eval(self$fun)(self$x))
}))

# Say, we want to add this function to an aclass object
foo <- function(x) mean(x, na.rm=TRUE)

这有效

# Instantiate class
my_class <- Aclass$new(c(0,1,NA))
# Add the function
my_class$add_fun(function(x) mean(x, na.rm=TRUE))
# my_class$add_fun(foo) # this also works
# Execute the function - beautiful - returns 0.5
my_class$do_fun()

这失败了

我的目标是执行与上述相同的操作,即向对象添加foo,但是现在通过重载+运算符以更好的方式完成工作

# Let's try to overload the + operator
`+.aclass` <- function(e1, e2) {
  return(e1$add_fun(e2))
}

# option 1
my_class <- Aclass$new(c(0,1,NA)) + foo
# fails
# Looking at my class we get
my_class
# > my_class                                       
# e2

# option 2 <--- this is my end goal
my_class <- Aclass$new(c(0,1,NA)) + mean(x, na.rm=TRUE)
# also fails because then R tries to execute the function
# > Error in mean(x, na.rm = TRUE) : Object 'x' not found

# Note: in this case, the custom +.aclass is not even called,
# but R calls the normal + method I think

我不确定如何解决这个问题,或者实际上是否可能...

谢谢你的帮助!

比利34

通过消除substituteadd_fun功能和返回self(因为你是它影响到一个新的对象)

    # this is the function adding part
    add_fun = function(fun) {
      self$fun <- fun
      self
    },

它将与

  • my_class <- Aclass$new(c(0,1,NA)) + foo
    还有
  • my_class <- Aclass$new(c(0,1,NA)) + function(x) mean(x,na.rm=TRUE)

对于您的目标案例,将更加困难

  • + mean(x, na.rm=TRUE)

甚至对ggplot2函数都进行了评估(例如,labs(x="title")将评估为添加到ggplot中的class label对象最终将调用function ggplot_add.labels

通过使用公式表示法稍微调整目标案例,可以解决问题

  • + ~mean(x, na.rm=TRUE)

使用此代码

`+.aclass` <- function(e1, e2) {
  se2 <- substitute(e2)

  # detect formula
  if(is.call(se2) && as.character(se2)=="~") {
    # build template function
    e3 <- substitute(function(x) y)
    # replace y in template by formula body
    e3[[3]] <- se2[[2]]
    # use our templated formula function
    e2 <- e3
  }
  e1$add_fun(e2)
  e1
}

最后,使用rlang中可用的高级功能,我们可以将其简化为

`+.aclass` <- function(e1, e2) {
  e1$add_fun(rlang::as_function(e2))
  e1
}

请注意,类似函数的公式需要使用.x而不是x

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

动态向r6类实例添加函数

来自分类Dev

向R6子类添加方法

来自分类Dev

R:如果要在“重载”代码中使用“-”,如何重载“-”运算符?

来自分类Dev

如何根据参数的调用运算符args或存在性来重载模板函数?

来自分类Dev

R中%in%运算符的重载

来自分类Dev

R中的重载&运算符

来自分类Dev

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

来自分类Dev

如何显式调用运算符<<的模板重载?

来自分类Dev

从父类调用基类重载运算符

来自分类Dev

如何修复分数类的重载+运算符的输出?

来自分类Dev

如何在模板类上实现运算符重载?

来自分类Dev

运算符-类重载

来自分类Dev

类的=运算符重载

来自分类Dev

运算符-类的重载

来自分类Dev

如何使运算符重载在好友函数中正常工作?

来自分类Dev

如何重载==运算符而不使其成为朋友函数?

来自分类Dev

运算符重载:从成员函数调用朋友函数

来自分类Dev

如何使用好友函数在模板类外部重载运算符==?

来自分类Dev

如何使用好友函数在模板类外部重载运算符==?

来自分类Dev

如何在 C++ 中的类中使用运算符重载函数?

来自分类Dev

运算符重载函数

来自分类Dev

R:如何获取重载泛型函数的定义?

来自分类Dev

如何快速重载赋值运算符

来自分类Dev

如何重载+ =“ plus equals”运算符?

来自分类Dev

如何正确重载+运算符

来自分类Dev

python运算符重载如何工作

来自分类Dev

如何重载运算符==?

来自分类Dev

C ++:如何正确重载<运算符?