gpt4 book ai didi

r - 插槽分配 : `@` vs `slot()` vs `setReplaceMethod()`

转载 作者:行者123 更新时间:2023-12-02 11:11:08 27 4
gpt4 key购买 nike

我正在编写我的第一个 R 包,我正在尝试找出为 S4 对象中的插槽分配值的最佳方法,请记住最终用户不必担心细节使用 S4 类结构。以下哪一个最好?

  1. 使用object@MySlot <- value直接访问插槽:

    我了解这种不好的做法(例如 this Q&A )。

  2. 使用slot(object, "MySlot") <- value :

    R 帮助说获取值时不进行检查,但设置时进行检查(假设 check 尚未设置为 FALSE )。这对我来说听起来很合理,并且让我觉得这是一种很好的方法,因为我不必按照下面的方式编写自己的 get/set 方法。

  3. 使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com