【问题标题】:R6 store methods by reference instead of copyR6 通过引用而不是复制来存储方法
【发布时间】:2015-04-15 23:06:26
【问题描述】:

我正在创建同一个类的多个 R6 对象,我的 cl 类包含一些繁重的方法。
据我了解 - 下面的代码 - 似乎每个对象都有自己的所有方法副本。
我怎样才能为我的所有cl 对象提供一个方法副本? S3 只存储方法的单个副本,不是吗?
我想为成千上万的cl 对象扩展它,所以宁愿省略开销。

library(R6)
cl <- R6Class(
  classname = "cl",
  public = list(
    a = numeric(),
    b = numeric(),
    initialize = function(x){ self$a <- rnorm(1, x); self$b <- rnorm(1, x) },
    heavy_method = function() self$a + self$b,
    print = function() self$heavy_method())
)
group_of_cl <- lapply(1:3, cl$new)
lapply(group_of_cl, ls.str)
## [[1]]
## a :  num 1.7
## b :  num 0.898
## heavy_method : function ()  
## initialize : function (x)  
## print : function ()  
## 
## [[2]]
## a :  num 2.64
## b :  num -0.29
## heavy_method : function ()  
## initialize : function (x)  
## print : function ()  
## 
## [[3]]
## a :  num 3.66
## b :  num 1.72
## heavy_method : function ()  
## initialize : function (x)  
## print : function ()
library(data.table)
sapply(lapply(group_of_cl, `[[`, "heavy_method"),address)
## [1] "0x31de440" "0x3236420" "0x32430a8"

【问题讨论】:

    标签: r r6


    【解决方案1】:

    你不应该担心这个。

    闭包是 R 中的very fast。在底层它可能有一些优化滴答来识别重复的函数定义并将它们存储在一个地方。

    【讨论】:

    • 创建速度很快,但是内存呢?在最坏的情况下,我会有大约 5-10 种方法,每个方法 200-1000 行代码。如果我创建该类的 10k-1m 个对象并将它们存储在 data.frame 列中,我应该担心吗?
    • 这一切都非常可缓存,让其他人担心,只关注你的代码。
    • 谢谢,接受。通过引用存储方法的可能性提供了为该类的所有现有对象更新方法的能力。看起来将方法外包给外部环境就足够了:heavy_method = sum 和我得到相同的内存地址。
    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2017-09-15
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多