can mode(),storage.mode()或typeof()可以返回“S3”吗?为什么或者为什么不? (他们可以返回“S4”!)

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

人们可以得到S4作为mode()storage.mode()typeof()的结果,如下所示。那么,S3的情况怎么样?为什么或者为什么不?

storing <- function(x) {print(c(class(x), mode(x), storage.mode(x), typeof(x)))}

setClass("dummy", representation(x="numeric", y="numeric"))

S4DummyObject = new("dummy", x=1:20, y=rnorm(20))

storing(S4DummyObject) # "dummy" "S4"    "S4"    "S4" 
r class types storage mode
1个回答
1
投票

至于typeof(),“mode(x)storage.mode(x)typeof(x)”不返回S3,因为: typeof()的文档似乎很清楚,可能的值包括S4,(但只有一些S4对象)而不是S3。 (正如约兰所说)。 (原因很可能是S3对象不是以任何特殊方式存储在内部,而不是像向量或列表那样)。

至于“mode(x)storage.mode(x)”,可以通过观察如果我们复制我们从“S4mode(x)”获得storage.mode(x)作为返回值的情况来观察会发生什么。

new_s3_lst <- function(x, ..., class) {
     stopifnot(is.list(x))
     stopifnot(is.character(class))
     structure(x, ..., class = class)
 } 

new_s3_scalar <- function(..., class) { new_s3_lst(list(...), class = class) }

S3DummyObject = new_s3_scalar(class="dummy")
class(S3DummyObject) # "dummy"
storing <- function(x) {print(c(class(x), mode(x), storage.mode(x), typeof(x)))}
storing(S3DummyObject) # "dummy" "list"  "list"  "list"

所以,人们可以分别获得dummyS4S4S4作为class(x)mode(x)storage.mode(x)typeof(x)的返回值;但对于S3,最多dummylistlistlist分别可以从class(x)mode(x)storage.mode(x)typeof(x)获得。

© www.soinside.com 2019 - 2024. All rights reserved.