问题标签 [reference-class]
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 - 在 R 中实现标准软件设计模式(专注于 MVC)
目前,我正在阅读很多关于软件工程、软件设计、设计模式等的内容。来自完全不同的背景,这对我来说都是新的迷人的东西,所以如果我没有使用正确的技术术语,请多多包涵描述某些方面;-)
我最终大部分时间都使用了引用类(R 中的一种 OOP 方式),因为面向对象似乎是我正在做的很多事情的正确选择。
现在,我想知道是否有人对在 R 中实现MVC(模型视图控制器;也称为MVP:模型视图演示器)模式有一些好的建议或经验,最好使用参考类。
我也对有关其他“标准”设计模式的信息(例如观察者、黑板等)非常感兴趣,但我不想让这个问题过于笼统。我想最酷的事情是看一些最小的示例代码,但任何指针、“模式”、图表或任何其他想法也将不胜感激!
对于那些对类似的东西感兴趣的人,我真的可以推荐以下书籍:
更新 2012-03-12
我最终提出了一个我对 MVC 的解释的小例子(这可能不完全正确;-))。
包依赖
类定义观察者
类定义模型
类定义控制器和视图
表示虚拟数据的类定义
创建实例
调查模型特征和观察者状态
请注意,对象的 uid 已在初始化时自动注册到观察者中。这样,控制器/视图可以订阅通知,我们有一个 1:n 的关系。
实例化视图和控制器
订阅
控制器订阅底层模型的通知
注意订阅已经登录到观察者
显示注册视图
还有一个打开的绘图窗口。
修改模型
请注意,当底层模型将其状态更改发布给观察者时,两个注册视图都会自动更新,观察者又会通知所有订阅者(即控制器)。
开放式问题
以下是我觉得我还没有完全理解的内容:
- 这是 MVC 模式的正确实现吗?如果不是,我做错了什么?
- 模型的“处理”方法(例如聚合数据、获取子集等)是否应该“属于”模型或控制器类。到目前为止,我总是将特定对象可以“做”的所有事情都定义为这个对象的方法。
- 控制器应该是一种“代理”,控制模型和视图之间的每次交互(有点“双向”),还是只负责将用户输入传播到模型(有点“单向”?
r - 引用类中的 RefClass 对象的列表(或数组)
我可以创建一个包含对象的父类
但是,我想用一组其他 RefClass 对象创建一个 RefClass 对象。我可以使用“列表”作为占位符并手动填写,但有更好的方法吗?
例如,可以指定一个“列表”类型来保存某个对象吗?假设是这样的:(但不起作用)
我希望当我在“imgList”上调用一个方法时,它知道为每个“img”元素调用方法。
r - R:更改类的字段(插槽)值,将值分配给其他字段
为一个字段分配一个值,我怎样才能使其他字段发生变化。
考虑以下ReferenceClass
对象:
现在创建类的实例
这个命令
将导致 c$a 为 10,c$b 为 20。
所以它确实有效,但是,我想通过命令来实现这个结果
(即之后我希望 c$b 等于 20,如 seta() 函数逻辑中的类中定义的那样)
我该怎么做?
r - R参考类问题
我正在尝试在 R 中创建一个简单的参考类。这是我的代码(R 初学者):
这会为最后一行 a$printValues 产生以下错误:
另外,没有调用初始化方法?
有人可以指出问题出在哪里吗?提前谢谢了。
r - 参考类字段消失
我决定再给参考类一个机会,但我的第一个 hello world 已经给我带来了问题。这里出了什么问题?
r - 从关联对象中检索定义 S4 引用类的实际源表达式
简而言之(实际问题)
如何访问定义 S4 引用类的实际源代码/表达式?setRefClass
(请参阅)或返回的对象(因此在获取它之后,而不是通过调查实际源文件)?getClass("MyClass")
getRefClass("MyClass")
我做的功课
由于一切都是 R 中的对象,我可以检索源代码/表达式
1)通过简单地调查相应对象的常规功能:
2)通过获取特定方法的方法对象的形式方法selectMethod
:
但是 S4 参考类的情况似乎有所不同:
我似乎找不到存储准确定义类的实际源代码/表达式的属性。
只是为了确保:这个表达式是我想要访问的
背景/动机
我经常使用 S4 引用类 ( ),因此像类继承?setRefClass
这样的OOP 方面在我的日常工作中扮演着重要角色。我还遵循“每个文件一个定义”的范例,以使事情井井有条,因此各种类定义存储在单独的文件中,其中文件名对应于各个类的名称。
与生活中的一切一样,这种方法有一些优点,但也有一些固有的缺点:
看点一
无论长短,您最终都会得到一个与各个源文件的字母文件顺序不再匹配的继承结构。因此,简单地一个接一个地获取一个文件将导致在某个特定点出现错误,其中一些所需的超类尚未被获取。
class_A.R
是 folder 中的第一个文件classes
,但为了获取它,我们首先需要获取源class_B.R
(因为该文件定义了 class B
),这反过来又需要 class C
,因此需要先获取class_C.R
.
因此,正确的排序规则是:
方面2
对于某些任务,您确实想要/需要“每个文件多个定义”范例:在并行化时快速轻松地将必要的对象/函数/类分配给工作进程,在实际构建包时组织代码等。
广告方面 1
我不喜欢保留某种手动整理参考来指定正确的采购顺序的想法,因为我认为这是计算机可以轻松为我完成的工作(找出正确的整理)。您在这里唯一需要做的就是找出每个类的超类(某种依赖关系),然后检索正确的排序规则就是小菜一碟。
编辑
如果有人感兴趣:我确实为此提出了一种工作方法。如果您想查看一些代码,请给我留言。它基于解析(不评估)相应的类 def 源文件,以调查contains
列出超类的参数的值。然后对这些超类的源文件递归地重复整个过程,直到最终得到正确的排序规则。也不是那么费时间。
这是大纲:
广告方面 2
我也不喜欢手动复制和粘贴,所以我实现了一个例程,允许我将存储在单个文件中或从各个对象中提取的源代码合并到单个“合并”文件(通过deparse(<source_code_expression>)
和write(..., append=TRUE)
)。至于类,正确的排序规则在这里也很重要,否则当您尝试获取合并文件时会再次出现错误。
对于这两个方面,能够选择如何获取类/函数/方法的实际源代码/表达式会很好:
- 或者基于调查存储在相应源文件中的代码 (
parse(file=*)
) - 或基于直接从相应对象访问所需信息。
第二个选项将是上述实际问题的链接。
r - 参考类、制表符补全和强制方法定义
我目前正在使用参考类编写一个包。我在阅读各种资料时遇到了一个问题:
无法在 Snowfall 中可靠地使用 RefClass 方法
我认为是因为引用方法并非全部复制到类中的每个对象,而是在第一次访问时被复制。
https://stat.ethz.ch/pipermail/r-devel/2011-June/061261.html
例如定义:
所以 example 是 class 的一个新对象TEST
。example$
在控制台中键入和制表符给出
因此该方法addone
未作为选项提供。但是可以调用:
现在标签再次显示
所以现在addone
和field
和show
作为选项呈现。
Martin Morgan 建议在上述链接之一中强制定义方法。这很好用
所以现在制表符给出:
我的一些课程有超过 30 种方法,所以我想尽可能简洁地做到这一点。我已经定义:
制表符现在给出:
虽然这有效,但感觉有点笨拙。也test$def@refMethods
被使用而不是getRefClass("TEST")$def@refMethods
这样,感觉有点不对劲。以前有没有人处理过这个问题。
有没有更好的方法来解决问题?如果问题过于冗长,感谢您的任何建议和道歉。
r - 构建定义引用类的 R 包
我正在创建一个 R 包。该包定义了几个参考类。类之间存在依赖关系,因为一个是基类,另一个是子类。由于这种依赖关系,包文件必须按一定的顺序加载:首先是基类,然后是子类。然而,仅凭我的运气,R 会先加载子类并抱怨未定义基类。
如何强制包的源文件以特定顺序执行?
我目前的kludge“解决方案”是将所有类定义放入一个源文件中,首先定义基类。说丑。一定有更好的办法。
r - 使用锁定变量复制 R5 引用类
当我没有锁定其中一个字段时,我可以复制 R5 引用类,但如果其中一个字段被锁定,它不会复制。示例代码如下(注释掉了锁定调用)。我的问题:为什么我不能使用 copy() 方法制作带有锁定字段的实例副本?
r - 引用类中引用类的实例化 - lock() 和不变性的问题
我从 R 参考类中遇到了一些我想解决的行为。在下面的代码中,引用类 B 中有两个引用类 A 的字段。
initialize()
在调用 B 的方法之前,B 中的这些字段似乎已用引用类 A 的零参数(默认)版本实例化(可能两次) 。然后在 B 的初始化过程中将这些实例替换为实例 A 的正确版本。问题是,如果我使用lock()
B 的实例生成器,A 的初始空实例无法在 B 中替换。另一个问题是引用类 A 在初始化 [或缺少(c)测试] 中需要一个默认值。
帮助 - 建议 - 等表示赞赏。