2

到目前为止我的研究

大多数文章都讨论了 和 之间的区别class,但我对、和之间的区别并typeof没有发现太多。modestorage.modetypeof

我明白了mode,storage.modetypeof更相似,class也更不同。我知道前两个电话typeof,我知道他们处理特定类型略有不同(我什至知道哪些以及如何处理)。我想知道的是这背后的想法是什么。

最小的工作示例

library(data.table)

my_vector_boolean <- c(TRUE, FALSE, T, F)
my_vector_integer <- c(1L, 2L, 3L)
my_vector_character <- c("a", "b", "abc")
my_vector_factor <- as.factor(c("a", "b", "c"))
my_list <- list(a=1, b=2L, c="c")
my_matrix <- matrix(c(1,2,3, 11,12,13), nrow = 2, ncol = 3, byrow = TRUE,
                    dimnames = list(c("row1", "row2"), c("col1", "col2", "col3")))
my_dataframe <- data.frame(1, 1L:10L, sample(3, 10, replace = TRUE))
my_datatable <- data.table(1, 1L:10L, sample(3, 10, replace = TRUE))

datatypeslist <- list(
  my_vector_boolean = my_vector_boolean,
  my_vector_integer = my_vector_integer,
  my_vector_character = my_vector_character,
  my_vector_factor = my_vector_factor,
  my_list = my_list,
  my_matrix = my_matrix,
  my_dataframe = my_dataframe,
  my_datatable = my_datatable
  )

multi.sapply <- function(...) {
      arglist <- match.call(expand.dots = FALSE)$...
      var.names <- sapply(arglist, deparse)
      has.name <- (names(arglist) != "")
      var.names[has.name] <- names(arglist)[has.name]
      arglist <- lapply(arglist, eval.parent, n = 2)
      x <- arglist[[1]]
      arglist[[1]] <- NULL
      result <- sapply(arglist, function (FUN, x) sapply(x, FUN), x)
      colnames(result) <- var.names[-1]
      return(result)
}

multi.sapply(datatypeslist, typeof, storage.mode, mode, class)

我在找什么

不是在寻找什么样的答案:“mode并以不同的方式storage.mode处理single

我正在寻找什么样的答案:“typeof是在底层 C 实现中使用的mode数据类型,而是......的数据类型并且storage.mode是......的数据类型”

此外,我希望能够区分手册和教程中使用的术语“模式”和“类型”。例如,有人说typeof返回数据对象的模式——这让我感到困惑。


我希望这个问题足够具体/清楚。在否决或投票结束之前,请告诉我有什么不清楚的地方。

4

1 回答 1

4

typeof是关键功能。

其他是typeof仅出于 S 兼容性目的而存在的变体,目前大多不使用。

storage.mode可以在使用数字数据调用 .Fortran 或 .C 时在 S 中使用,这样您就可以知道输入是否为integeror double。在 R 中,这种区别通常会变得模糊,但是在将对象传递给这些语言时,这种区别很重要。在这方面就像typeofmode只是给numeric这两个,所以它更粗糙。

> mode(1L)
[1] "numeric"
> storage.mode(1L)
[1] "integer"

> mode(1)
[1] "numeric"
> storage.mode(1)
[1] "double"

通过查看它们的来源可以最好地理解它们的操作。在这两种情况下,来源都很短。

例如,返回与除非storage,mode返回的值相同的值is ,或者在这些情况下返回。typeoftypeof"closure""builtin""special""function"

storage.mode <- function (x) 
   switch(tx <- typeof(x), closure = , builtin = , special = "function", tx)
于 2016-04-22T13:26:37.203 回答