Может ли mode (), storage.mode () или typeof () вернуть "S3"?Почему или почему нет?(Они могут вернуть «S4»!) - PullRequest
0 голосов
/ 26 апреля 2019

Можно получить 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" 

1 Ответ

1 голос
/ 28 апреля 2019

Что касается typeof(), "mode(x), storage.mode(x), typeof(x)" не возвращаются S3, так как:
Документация для typeof() кажется довольно ясной, что возможные значения включают S4, (но только некоторые S4 объекты), а не S3. ( как сказал Джоран ).
(Вероятно, причина в том, что S3 объекты не хранятся внутри каким-либо особым образом, отдельно от того, чтобы быть чем-то вроде вектора или списка).

Что касается "mode(x), storage.mode(x)", это можно увидеть, наблюдая, что произойдет, если мы повторим ситуацию, которую мы получили S4 в качестве возвращаемого значения из "mode(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"

Таким образом, можно получить dummy, S4, S4, S4 соответственно как возвращаемое значение class(x), mode(x), storage.mode(x), typeof(x); но для S3 максимум dummy, list, list, list соответственно можно получить из class(x), mode(x), storage.mode(x), typeof(x).

...