问题标签 [r6]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
152 浏览

r - xts 引用赋值

让我们:

如果我们将 a 分配data.table到对象槽中,然后修改外部数据表,那么对象槽中的数据表也会通过引用进行修改:

让我们做一个类似的实验xts

与. xts_data.table

是否有可能以某种方式实现xts通过引用共享?

0 投票
3 回答
1579 浏览

r - 将函数动态添加到 r6 类实例

我试图忘记引用类(R5)并移至 R6,但动态代码存在问题。我会添加一个新功能,它适用于 R5:

类似的代码不适用于 R6。

在类定义中添加predict没有任何改变,同样的错误。 有什么解决办法吗?提前致谢。

补充:在@G.Grothendieck 很好的回答之后,我有基于字符串的函数定义,但也许有更优雅的解决方案。

0 投票
1 回答
297 浏览

r - R6 类的 S4 调度行为不一致

实际问题

  1. R6类继承自(非正式 S3)类的事实不应该R6允许为该类的签名参数定义 S4 方法吗?

  2. 因为这是 - AFAICT - 不是这种情况,在这种情况下,符合当前 S3/S4 标准或在某种程度上可以被视为“最佳实践”的解决方法是什么?

背景和例子

参考类

考虑以下示例,您希望定义在所有引用类envRefClass实例从 ( )继承的超类上调度的方法:

这种继承结构并不直接明显,因为class()不会揭示这一事实:

但是,查看类生成器对象的属性会发现:

这就是调度工作的原因

R6 班

当您想为 R6 类做类似的事情时,事情似乎并不直接,即使它们最初看起来如此(与参考类相比):

通过“直接出现”,我的意思是class()实际上表明所有 R6 类都继承自R6可用作方法分派的超类的类:

的帮助页面R6Class()实际上显示该类R6只是作为一个非正式的 S3 类添加只要class = TRUE。这也是尝试为此类定义 S4 方法时出现警告的原因。

那么这基本上给我们留下了两种可能的选择/解决方法:

  1. 通过将课堂R6变成正式课堂setOldClass()
  2. 让 R6 类的所有实例都继承自某个其他超类,例如,.R6

广告 1)

这在类表/图表中以 S3 风格破解时有效:

但是,对于实际的 R6 类实例,它会失败:

广告 2)

结论

虽然方法 1 排序在“灰色区域”中运行以使 S3 和 S4 在某种程度上兼容,但方法 2 似乎是 IMO 应该工作的完全有效的“纯 S4”解决方案。事实上,如果 R6 类的实现在 R 中非正式/正式类的交互和方法分派方面存在不一致,这并没有让我提出这个问题。

0 投票
1 回答
600 浏览

r - 在 R6 类上实现 S3 调度的正确方法

我有一个R6类,我想S3为它添加一个方法。我发现的文档简要提到了要使用S3dispatch on R6you must have class = TRUE,但我找不到应该如何完成的示例。

我确实从经验上看到,简单地以这种形式编写一个 S3 方法是s3generic.r6class有效的,但我想知道这是否确实是S3R6.

例如,假设我有一R6门课可以增强list

问题 1

自然,我想提供一个获取底层列表的方法,所以我想添加一个as.list方法。在类中添加 S3 泛型和as.list公共函数是否标准?我直观的答案是两者都加。

所以现在如果我有一个对象mylist <- R6list$new(as.list(letters[1:5])),我可以调用as.list(mylist)mylist$as.list(). 其中一个比另一个更受欢迎吗?

问题2为类编写方法
有什么特别之处,或者我上面写的内容是否足够且正确?我不确定该方法是否必须在类定义之外编写,或者是否以某种方式提供了一种在其中编写方法的方法,以便与该类相关的所有代码都本地化。S3R6S3R6S3

0 投票
1 回答
584 浏览

r - 将方法添加到 R6 子类

我开始为工作中的项目修改 R6,但我无法理解以下行为。

假设我定义了一个超类Person和一个子类PersonWithAge

如果我尝试向子类添加新方法,则会PersonWithAge收到以下错误:

现在,如果我用虚拟方法定义一个新的子类,我可以毫无问题地向子类添加新方法:

我尝试更改类定义lock中的参数,R6Class但无济于事。会话信息是:

我也使用此会话信息在另一台机器上得到相同的行为:

我的问题如下:

  1. 我错过了什么还是正常和预期的行为?在那种情况下,为什么会这样?
  2. 只要我在这里:据我了解,R6 中没有虚拟类和抽象方法的真正实现吗?

编辑:好的,在查看包的源代码后,我意识到,在这一行:

grouppublic_methods, private_methods, public_fields,之一private_fields。所以我猜当一个类被创建时没有任何公共方法,向该类添加一个新的公共方法会失败,因为该组实际上并不存在。

0 投票
2 回答
2013 浏览

r - R6 类中的静态方法

有没有办法将静态方法添加到 R6 类?例如,可以像这样调用的函数

代替

0 投票
1 回答
432 浏览

r - 在保留继承的同时注册 R6 类的 S4 等效项

实际问题

当所有类都需要位于包的命名空间中(而不是 in )时,如何将一堆相互继承的 R6 类转换为 S4 类,同时保留继承结构GlobalEnv

细节

在 R6 类已在中定义.GlobalEnv(如使用 采购时source())并且setOldClass()也使用 调用的情况下,一切正常where = .GlobalEnv

但是当 R6 类在包的命名空间中定义时(如调用时),我无法让它工作devtools::load_all()

在中定义 R6 类.GlobalEnv

调用setOldClass()where = .GlobalEnv默认where):

当 R6 类在包的命名空间中定义时(如使用devtools::load_all()而不是“采购”时source()),我假设我需要通过提供显式来说明这一点where

但是,这给我留下了以下错误:

setOldClass(c("Module", "Api"), where = where) 中的错误:“Module”的旧式类信息不一致;该类已定义但未扩展“Api”,并且作为数据部分无效


促进再现性

我试图让这个问题尽可能容易重现,所以你可以在我的GitHub 存储库r6.s4中找到该包

再次注意,您必须运行devtools::load_all()(或CRTL + SHFT + L在 RStudio 中点击)才能重现错误

此外,这个单元测试可能有助于弄清楚发生了什么。

0 投票
1 回答
227 浏览

r - R6 通过引用而不是复制来存储方法

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

0 投票
0 回答
132 浏览

r - R6 对象是否与并行包兼容?

我正在考虑将 R 的 S4 方法单独留在 OOP 上,我想尝试将 OOP 与较新的 R6 包一起使用。现在我想知道:我使用 R6 包构建的对象是否与“并行”包兼容?谢谢你们。

0 投票
2 回答
639 浏览

r - 通过引用在 R 中的向量上进行子分配

我可以以某种方式在原子向量上使用引用子分配吗?
当然,无需将其包装在 1 列 data.table 中即可使用:=

如果 R6 可以提供帮助,我愿意接受 R6 解决方案,因为它已经是我的部门之一。
我已经检查过<-内部R6对象仍然会复制:gist