如何访问S4对象的方法

晨翅

我当前的项目正在使用S4对象,我想访问python或C等通用方法。这是示例

setClass("Account",
         representation(balance = 'numeric', holder = 'character'),
         prototype = prototype(balance = NA_real_, holder = NA_character_),
         validity = function(object) {
           if (object@balance < 10) {
             return("The start balance should not be negative")
           }
           return(TRUE)
         })

setMethod("show", signature = "Account",
          definition = function(object) {
            cat("The account holder is", object@holder, "\n")
            cat("The account balance is", object@balance, "\n")
          })

setGeneric("deposit", def = function(.Object, amount) {
  standardGeneric("deposit")
})

setMethod("deposit", signature = "Account",
          definition = function(.Object, amount) {
            nameObject <- deparse(substitute(.Object))
            .Object@balance <- .Object@balance + amount
            assign(nameObject, .Object, envir = parent.frame())
            return(invisible())
      })

目前,我可以使用以下内容:

acc <- new("Account", balance = 10, holder = "nal-ra")
deposit(acc, 20)
acc
#> The account holder is nal-ra 
#> The account balance is 30 

我想使用acc$.$deposit(20)代替deposit(acc, 20)

我知道引用类和R6类可以完成这项工作,但是我的项目无法使用它们。

马丁·摩根

S4方法不能那样工作。而是更新并返回对象

setMethod("deposit", signature = "Account",
    definition = function(.Object, amount) {
        .Object@balance <- .Object@balance + amount
        .Object
})

acc = deposit(acc, 20)

另一种表达方式是写deposit<-替代方法

setGeneric("deposit<-", function(x, value) standardGeneric("deposit<-"))
setReplaceMethod("deposit", c("Account", "numeric"), function(x, value) {
    x@balance <- x@balance + value
    x
})

> acc <- new("Account", balance = 10, holder = "nal-ra")
> deposit(acc) <- 20
> acc
The account holder is nal-ra 
The account balance is 30 

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

访问S4对象插槽内的数据

来自分类Dev

什么时候在R中调用S4对象的访问器方法?

来自分类Dev

如何禁止S4对象的空插槽?

来自分类Dev

如何定义S4取反对象的方法?

来自分类Dev

R:从S4对象获取插槽的值(ScalarIndependenceTest)

来自分类Dev

遍历S4对象插槽Rcpp

来自分类Dev

带S4对象插槽的tbl_df

来自分类Dev

将S4对象存储在矩阵中

来自分类Dev

在R中创建S4对象

来自分类Dev

从列表向量monitoR中提取S4对象

来自分类Dev

将S4对象存储在矩阵中

来自分类Dev

在R中创建S4对象

来自分类Dev

为什么lapply无法在具有as.list.default方法的S4对象上工作?

来自分类Dev

如何为S4类向量化访问器方法?

来自分类Dev

使用类函数更改S4对象的“类”时会发生什么情况?

来自分类Dev

使用.Call()将s4对象发送到C结构

来自分类Dev

将S4对象转换为R中的数据框或列表问题

来自分类Dev

如何实现S4方法的子集替换

来自分类Dev

如何访问Angular 2对象的属性

来自分类Dev

如何访问Angular 2对象的属性

来自分类Dev

如何继承stan的S4类

来自分类Dev

如何使用Carrierwave-Aws将S3对象更新为不频繁访问

来自分类Dev

如何从代码构建buildspec中获取S3对象?(拒绝访问)

来自分类Dev

如何使用javascript中同一对象内的公共方法访问私有变量?

来自分类Dev

在Rcpp中创建R S4类的对象?

来自分类Dev

整齐或不必要的S4 BFBayesFactor对象

来自分类Dev

R 中 S4 对象的并行化错误

来自分类Dev

如何获得R中S4类上定义的所有方法的列表?

来自分类Dev

如何使 S4 类从另一个 S4 类正确继承?