这两种创建 S4 对象的方法有何不同?

问题描述 投票:0回答:1

我在各种包中都看到过这些实例。

1)

foo <- setClass('foo',[slots defined])
bar <- foo([data ]) 

或者 2)

setClass('foo',[slots defined])
bar <- new('foo',[data])

性能或

NAMESPACE
文件中所需的材料是否有任何差异?

r class
1个回答
0
投票

它们是相同的。

您的

foo(...)
正在呼叫
new("foo", ...)

拳头面包屑:

# slots or something need to be defined
# otherwise we would get error during instantiation

foo = setClass("foo", slots = c(x = "numeric"))
foo
# class generator function for class “foo” from package ‘.GlobalEnv’
# function (...) 
# new("foo", ...)

所以

foo
返回一个函数
new("foo", ...)

还有一些事情不会有任何结果:

fo = unclass(foo)
is(fo)
# [1] "function"         "OptionalFunction" "PossibleMethod"  
print(fo)
# <S4 object of class NULL>
# attr(,"className")
# [1] "foo"
# attr(,"className")attr(,"package")
# [1] ".GlobalEnv"
# attr(,"package")
# [1] ".GlobalEnv"

我没有继续那里,而是查看了代码:

class(foo)
# [1] "classGeneratorFunction"
# attr(,"package")
# [1] "methods"

显然,

setClass
返回一个
classGeneratorFunction
的对象:

setClass <-
    ...
    invisible(classGeneratorFunction(classDef, where))

但我想指出以下几行:

https://github.com/wch/r-source/blob/4aa0fbba136591d6e7744fab83d722b5a5e5c690/src/library/methods/R/SClasses.R#L944-L972

具体来说:https://github.com/wch/r-source/blob/4aa0fbba136591d6e7744fab83d722b5a5e5c690/src/library/methods/R/SClasses.R#L965-L966

    body(fun) <- substitute(new(CLASS, ...),
                            list(CLASS = classDef@className))
© www.soinside.com 2019 - 2024. All rights reserved.