问题标签 [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.
r - xts 引用赋值
让我们:
如果我们将 a 分配data.table
到对象槽中,然后修改外部数据表,那么对象槽中的数据表也会通过引用进行修改:
让我们做一个类似的实验xts
:
与. xts
_data.table
是否有可能以某种方式实现xts
通过引用共享?
r - 将函数动态添加到 r6 类实例
我试图忘记引用类(R5)并移至 R6,但动态代码存在问题。我会添加一个新功能,它适用于 R5:
类似的代码不适用于 R6。
在类定义中添加predict没有任何改变,同样的错误。 有什么解决办法吗?提前致谢。
补充:在@G.Grothendieck 很好的回答之后,我有基于字符串的函数定义,但也许有更优雅的解决方案。
r - R6 类的 S4 调度行为不一致
实际问题
R6类继承自(非正式 S3)类的事实不应该
R6
允许为该类的签名参数定义 S4 方法吗?因为这是 - AFAICT - 不是这种情况,在这种情况下,符合当前 S3/S4 标准或在某种程度上可以被视为“最佳实践”的解决方法是什么?
背景和例子
参考类
考虑以下示例,您希望定义在所有引用类envRefClass
实例从 ( )继承的超类上调度的方法:
这种继承结构并不直接明显,因为class()
不会揭示这一事实:
但是,查看类生成器对象的属性会发现:
这就是调度工作的原因
R6 班
当您想为 R6 类做类似的事情时,事情似乎并不直接,即使它们最初看起来如此(与参考类相比):
通过“直接出现”,我的意思是class()
实际上表明所有 R6 类都继承自R6
可用作方法分派的超类的类:
的帮助页面R6Class()
实际上显示该类R6
只是作为一个非正式的 S3 类添加只要class = TRUE
。这也是尝试为此类定义 S4 方法时出现警告的原因。
那么这基本上给我们留下了两种可能的选择/解决方法:
- 通过将课堂
R6
变成正式课堂setOldClass()
- 让 R6 类的所有实例都继承自某个其他超类,例如,
.R6
广告 1)
这在类表/图表中以 S3 风格破解时有效:
但是,对于实际的 R6 类实例,它会失败:
广告 2)
结论
虽然方法 1 排序在“灰色区域”中运行以使 S3 和 S4 在某种程度上兼容,但方法 2 似乎是 IMO 应该工作的完全有效的“纯 S4”解决方案。事实上,如果 R6 类的实现在 R 中非正式/正式类的交互和方法分派方面存在不一致,这并没有让我提出这个问题。
r - 在 R6 类上实现 S3 调度的正确方法
我有一个R6
类,我想S3
为它添加一个方法。我发现的文档简要提到了要使用S3
dispatch on R6
you must have class = TRUE
,但我找不到应该如何完成的示例。
我确实从经验上看到,简单地以这种形式编写一个 S3 方法是s3generic.r6class
有效的,但我想知道这是否确实是S3
为R6
.
例如,假设我有一R6
门课可以增强list
问题 1
自然,我想提供一个获取底层列表的方法,所以我想添加一个as.list
方法。在类中添加 S3 泛型和as.list
公共函数是否标准?我直观的答案是两者都加。
所以现在如果我有一个对象mylist <- R6list$new(as.list(letters[1:5]))
,我可以调用as.list(mylist)
或mylist$as.list()
. 其中一个比另一个更受欢迎吗?
问题2为类编写方法
有什么特别之处,或者我上面写的内容是否足够且正确?我不确定该方法是否必须在类定义之外编写,或者是否以某种方式提供了一种在其中编写方法的方法,以便与该类相关的所有代码都本地化。S3
R6
S3
R6
S3
r - 将方法添加到 R6 子类
我开始为工作中的项目修改 R6,但我无法理解以下行为。
假设我定义了一个超类Person
和一个子类PersonWithAge
:
如果我尝试向子类添加新方法,则会PersonWithAge
收到以下错误:
现在,如果我用虚拟方法定义一个新的子类,我可以毫无问题地向子类添加新方法:
我尝试更改类定义lock
中的参数,R6Class
但无济于事。会话信息是:
我也使用此会话信息在另一台机器上得到相同的行为:
我的问题如下:
- 我错过了什么还是正常和预期的行为?在那种情况下,为什么会这样?
- 只要我在这里:据我了解,R6 中没有虚拟类和抽象方法的真正实现吗?
编辑:好的,在查看包的源代码后,我意识到,在这一行:
group
是public_methods
, private_methods
, public_fields
,之一private_fields
。所以我猜当一个类被创建时没有任何公共方法,向该类添加一个新的公共方法会失败,因为该组实际上并不存在。
r - R6 类中的静态方法
有没有办法将静态方法添加到 R6 类?例如,可以像这样调用的函数
代替
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 中点击)才能重现错误。
此外,这个单元测试可能有助于弄清楚发生了什么。
r - R6 通过引用而不是复制来存储方法
我正在创建同一个类的多个 R6 对象,我的cl
类包含一些繁重的方法。
正如我的理解 - 下面的代码 - 似乎每个对象都有它自己的所有方法的副本。
我怎样才能拥有所有cl
对象的单一方法副本?S3 只存储方法的单个副本,不是吗?
我想为数千个cl
对象缩放它,所以宁愿省略开销。
r - R6 对象是否与并行包兼容?
我正在考虑将 R 的 S4 方法单独留在 OOP 上,我想尝试将 OOP 与较新的 R6 包一起使用。现在我想知道:我使用 R6 包构建的对象是否与“并行”包兼容?谢谢你们。
r - 通过引用在 R 中的向量上进行子分配
我可以以某种方式在原子向量上使用引用子分配吗?
当然,无需将其包装在 1 列 data.table 中即可使用:=
。
如果 R6 可以提供帮助,我愿意接受 R6 解决方案,因为它已经是我的部门之一。
我已经检查过<-
内部R6
对象仍然会复制:gist。