问题标签 [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 - 定义调用 R6 对象之外的其他方法的方法
使用 R6 类时,在类之外定义调用其他方法的方法的正确方法是什么?
考虑以下示例,func
如果以交互方式使用该函数,则该函数可能会分派给另一个函数。但是,如果这样做,则其他功能无法访问私有环境。如果我以这种方式定义类,我应该传递一个环境吗?
ifunc() 中的错误(来自 #3):找不到对象“私有”
r - R6 类的多重继承
实际问题
免责声明
我知道 R 主要是一种函数式语言。但是,它也确实内置了非常强大的面向对象。另外:我看不出模仿 OOD 原则/行为有什么问题
知道您正在为 C#、Java 等面向对象的语言进行原型设计。
您的应用程序原型需要自给自足(“全栈”,包括数据库后端、业务逻辑和前端/UI)
您拥有像 R6 这样出色的“原型制作技术”,并且可以随意使用
语境
我的 Web 应用程序R原型需要“全栈”/自给自足,并尽可能接近我们的生产语言 (C#/.网)。
在这方面,我非常喜欢使用接口(或抽象类)来解耦代码模块并遵守OOD的SOLID原则的D(依赖倒置原则)(“鲍伯叔叔”的详细解释) )。
尽管 R6 没有明确支持接口,但我仍然可以使用 R6 类完美地模仿它们,这些类只定义“抽象方法”(参见下面的示例)。这有助于我将我的软件设计传达给我们对 R 不太熟悉的 OO 程序员。我力求他们尽可能少地进行“概念转换工作”。
但是,当我实际上想从其他具体(而不是“类抽象”模仿的接口类)继承时,我需要放弃我的价值,inherit
因为这意味着不定义一个但在.R6Class
inherit
例子
依赖反转之前:
Foo
取决于具体类Bar
。从 OOD 原则的角度来看,这非常糟糕,因为它会导致代码紧密耦合。
依赖反转后:
Foo
并且Bar
现在解耦了。两者都依赖于由 class 模仿的接口IBar
。我可以决定我想在运行时将该接口的哪个实现Foo
插入到实例中(通过属性注入实现:字段bar
)Foo
为什么这对 OOD 有意义:Foo
应该完全不知道存储在字段中的对象的bar
实现方式。它只需要知道它可以在该对象上调用哪些方法。为了知道这一点,知道字段中的对象实现的接口就足够了(在我们的例子中是方法)。bar
IBar
doSomething()
使用从基类继承来简化设计:
到目前为止,一切都很好。但是,我还想通过定义某些我的其他具体类可以继承的具体基类来简化我的设计。
结合“接口实现”和基类继承:
这是我需要多重继承的地方,所以这样的东西可以工作(伪代码):
目前,我的价值inherit
已经被“仅仅”用于模仿接口实现,因此我失去了继承对于我的实际具体类的“实际”好处。
另类的想法:
或者,以某种方式显式支持接口 和具体类之间的区别会很棒。例如像这样
r - 使用闭包生成 R6 绑定
我在 R6 类中使用活动绑定在分配给字段之前检查值。我以为我可以使用闭包来生成如下绑定,但这不起作用。
绑定没有以我期望的方式进行评估(完全?),因为错误显示了闭包的name
参数。我错过了什么?
r - R中R6类的“用户”构造函数
我正在学习如何使用 R6 类(以及一般的 R OO)。
在本教程中,我发现了一种表示构造函数的有趣方式。在 6.3 节中定义了一种不同类型的构造函数,返回一个在函数内部调用“new”的类实例。
这类似于使用计算某些东西的函数初始化类对象的行为,这对我的目的很有用。
我想知道这是否也可以在 R6 中完成,如果可以,是否有资源可以让我学习如何正确地做到这一点。
我在 S4 中的示例如下:
现在,创建的代码eTable
会eList
稍微复杂一些,但这就是原则。用户不需要调用 $new,而是调用一个返回适当对象的函数。我以为我可以把函数放在 R6 类中,但我不知道如何调用它。
r - 更改 R6 类的子类中的初始化方法
假设我有一个 R6 类Person
:
如果我想创建一个子类,它的initialize
方法应该是相同的,除了添加一个变量,self
我该怎么做?
我尝试了以下方法:
但是,当我创建类的新实例时PersonWithSurname
,字段name
和hair
是NA
,即类的默认值Person
。
在Python
我会做以下事情:
r - 在 R 中测试 R6 类中的私有方法
我目前在一个项目中使用 R6 类。
我想编写单元测试来测试我正在使用的私有方法的功能(最好不要通过使用这些私有方法的更复杂的公共方法)。
但是,我似乎无法访问私有方法。
我怎样才能最好地做到这一点?
谢谢!
r - R,R6,公共方法的形式
如何在 R6 类定义中获得方法定义的形式?
因此,例如,在上面,我想获得fun
定义的形式,以同样的方式执行,例如,formals(lm)
r - R,R6,从 R6Generator 对象获取完整的类名
在 R6 中,如何在不创建生成器对象的实例的情况下获得类继承的完整列表?
考虑以下:
我想要的是c('Top','Base','R6')
换句话说,否则会返回class(B$new())
在现实世界中,我有一组复杂的继承,以及带有许多参数的初始化程序,其中一些没有默认值,所以我试图避免实例化一个新对象以获取这些信息。
r - R, R6 运算符重载
考虑以下:
这会引发错误:
如何解决上述问题,使两者A
和B
可以重载+
运算符,并相加。
r - 在函数中强制返回类型
使用 R6,我想强制方法返回特定的数据类型,这可能吗?
例如,考虑以下几点:
如果我想强制函数getx()
返回一个整数,A 的实例很好,但我想防止子类返回不同的类型,例如 B 的情况。换句话说,我希望函数具有一致性在它返回的内容中,无论它实际在哪里实现。