- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写我的第一个 R 包,我正在尝试找出为 S4 对象中的插槽分配值的最佳方法,请记住最终用户不必担心细节使用 S4 类结构。以下哪一个最好?
使用object@MySlot <- value
直接访问插槽:
我了解这种不好的做法(例如 this Q&A )。
使用slot(object, "MySlot") <- value
:
R 帮助说获取值时不进行检查,但设置时进行检查(假设 check
尚未设置为 FALSE
)。这对我来说听起来很合理,并且让我觉得这是一种很好的方法,因为我不必按照下面的方式编写自己的 get/set 方法。
使用 setReplaceMethod()
的自定义方法:
此方法与上面的第二个选项相比如何?生成必要的获取/设置方法需要更多工作,但我可以更明确地确保写入插槽的值对于该插槽类型有效。
setGeneric("MySlot", function(object) {
standardGeneric("MySlot")
})
setMethod("MySlot",
signature = "MyClass",
definition = function(object) {
return(object@MySlot)
})
setGeneric("MySlot<-",
function(object, value) {
standardGeneric("MySlot<-")
})
setReplaceMethod("MySlot",
signature="MyClass",
function(object, value) {
object@MySlot<- value
validObject(object) # could add other checks
return(object)
})
最佳答案
根据定义,“不必担心 S4 类结构的细节”意味着最终用户不必了解您的插槽。因此,您在步骤 2 和 3 中编写的任何包装器都更多地用于内部一致性检查。我认为更重要的是检查您认为使用 unit tests 进行完整性检查会失败的边缘情况。 .
正如您所指出的,#1 可以很容易地被排除,并且只能在内部方法中使用。无论你鼓励#2还是实现#3取决于变量的内容和个人品味,但我会鼓励后者。例如,如果您有 logical
标志,您可以使用 #2,但更具描述性的是 enableFoo()
。话虽这么说,如果您必须考虑开发人员时间(这在现实生活中几乎总是如此),您应该简要考虑将更改器(mutator)降级为 slot<-
之间的权衡。对于可能不会经常访问的成员(例如,不到 1% 的用户),而不是像 #3 中那样为所有内容实现自定义修改器。
最后,由于几乎所有三个 R 的 OOP 系统本质上都是语法糖,并且在语义上并没有真正受到语言的尊重(只有 S4 可以声明一些异常(exception)),因此很容易忘记面向对象编程背后的基本思想正如在其他语言中实现的那样:在您的方法之外执行的任何代码都不应该知道该对象的成员。您正在向世界提供一个外部接口(interface),它是并且应该是一个黑匣子。
关于r - 插槽分配 : `@` vs `slot()` vs `setReplaceMethod()` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22546638/
插槽到底是个啥?5分钟搞定 Vue 插槽 插槽的基本使用 组件使用slot标签,显示组件标签的内容 Title aaa Vu
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
我有一个对象,它用一个对象发出信号: MyObj *obj = this->generateObj(); emit newObjSignal(obj); delete obj; 我有一个或多个人与此有
距离ETS的发布也有一段时间,也有不少小伙伴通过ETS制作出很多精美的页面,但在我查阅ETS的组件和API中发现,现有版本的ETS并没有插槽的功能。经过一段时间的探索终于找到曲线救国方式实现插槽
我无法找到有关使用资源管理器模板以编程方式向 WebApp 添加插槽的信息/指南。我的基本配置运行良好,创建了 WebApp 本身、SQL 服务器、SQL DB 等,但我也渴望完成插槽,以便我可以将它
我们的项目位于 sitecore 中,并使用 Azure - 应用服务进行部署。我们已经创建了暂存槽,除了应用程序设置和连接字符串之外,还希望使一些配置文件槽特定(交换时坚持槽)。 有没有办法让整个配
我使用 Azure 插槽功能来部署我的机器人: 部署到“暂存”槽 Azure 启动此实例 启动后,我会交换“生产”和“登台”时段 我想在进行插槽之前测试暂存实例,最好使用 Azure 门户中的 Web
我使用 Azure 插槽功能来部署我的机器人: 部署到“暂存”槽 Azure 启动此实例 启动后,我会交换“生产”和“登台”时段 我想在进行插槽之前测试暂存实例,最好使用 Azure 门户中的 Web
我的应用程序只能通过右键单击托盘图标并按“退出”来退出: class DialogUIAg(QDialog): ... self.quitAction = QAction("&Quit
我不太确定如何将其总结为一个谷歌问题,但也许详细解释它会给我更好的帮助。 我正在尝试找到与在 PHP 中的 python 中设置槽的等价物 python : class Node: slots
我浪费了几个小时试图找出这个错误,但我仍然不知道为什么会发生...所以我求助于你! 我将一个对象移动到一个线程中,该线程执行一些工作,完成后会发出一个信号以供 QMainWindow 捕获。就这么简单
我有一个自旋控件 block ,它可以更改数组的各个元素我不想使用单独的接收器槽函数,而是只想指定哪个控件在信号中发送消息 您可以使用 QSignalMapper 来做到这一点——但是是否可以像下面那
我想知道如何将一个单独的变量传递到一个插槽中。我似乎无法让它工作。有什么办法解决这个问题吗? 这是我的代码: QTimer * timer = new QTimer(); connect(timer,
我有一个基类,它定义了一个 Qt 插槽 class Base { public: Base() { connect(otherobject, SIGNAL(mySign
这是基类中声明的样子: protected: void indexAll(); void cleanAll(); 在派生类中,以下不编译: indexAll(); // OK con
比如我有一个函数 void A::fun() { do_1(); emit signal_1(); do_2(); emit signal_2(); do_3(
我希望能够将视频从连接到我的计算机的摄像头直接流式传输到我通过 PCIE 连接到我的计算机的 FPGA。 我不介意使用 javascript 或 C# 等高级语言来执行此操作(因为这些是我知道的具有视
Qt世界中,事件和信号/槽的区别是什么? 一个会取代另一个吗?事件是信号/槽的抽象吗? 最佳答案 Qt documentation可能解释得最好: In Qt, events are objects,
1. 监听属性值的变化 - watch 语法要求:watch里面的函数名必须跟date里面属性名一致 {{num}} 添加 var
在 Class Buttons 中,我有一个 btnRightClicked 信号和一个 mousePressEvent 插槽: void Buttons::mousePressEvent(QMous
我是一名优秀的程序员,十分优秀!