R 中 mode, storage.mode, typeof 有什么区别(就想法而言)?
What is the difference (in terms of idea) of mode, storage.mode, typeof in R?
我目前的研究
大多数文章都讨论了 class
和 typeof
之间的区别,但我没有发现 mode
、storage.mode
和 typeof
之间的区别].
我知道 mode
、storage.mode
和 typeof
更相似,而 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
是...的数据类型
此外,我希望区分手册和教程中使用的术语 "mode" 和 "type"。例如,据说 typeof
return 数据对象的模式 - 这让我感到困惑。
我希望这个问题 specific/clear 够了。请在否决或投票结束之前告诉我不清楚的地方。
typeof
是关键函数。
其他的是 typeof
的变体,它们的存在仅是为了与 S 兼容,如今大多已不再使用。
storage.mode
可以在 S 中使用,当用数字数据调用 .Fortran 或 .C 时,您可以知道输入是 integer
还是 double
。这种区别在 R 中通常是模糊的,但是当将对象传递给这些语言时,区别很重要。在这方面就像typeof
。 mode
只是为这两个给出 numeric
所以它更粗糙。
> mode(1L)
[1] "numeric"
> storage.mode(1L)
[1] "integer"
> mode(1)
[1] "numeric"
> storage.mode(1)
[1] "double"
最好通过查看它们的来源来了解它们的操作。在这两种情况下,来源都很短。
例如,storage,mode
returns 与 typeof
相同的值,除非 typeof
返回的值是 "closure"
、"builtin"
或"special"
在这些情况下 returns "function"
.
storage.mode <- function (x)
switch(tx <- typeof(x), closure = , builtin = , special = "function", tx)
我目前的研究
大多数文章都讨论了 class
和 typeof
之间的区别,但我没有发现 mode
、storage.mode
和 typeof
之间的区别].
我知道 mode
、storage.mode
和 typeof
更相似,而 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
是...的数据类型
此外,我希望区分手册和教程中使用的术语 "mode" 和 "type"。例如,据说 typeof
return 数据对象的模式 - 这让我感到困惑。
我希望这个问题 specific/clear 够了。请在否决或投票结束之前告诉我不清楚的地方。
typeof
是关键函数。
其他的是 typeof
的变体,它们的存在仅是为了与 S 兼容,如今大多已不再使用。
storage.mode
可以在 S 中使用,当用数字数据调用 .Fortran 或 .C 时,您可以知道输入是 integer
还是 double
。这种区别在 R 中通常是模糊的,但是当将对象传递给这些语言时,区别很重要。在这方面就像typeof
。 mode
只是为这两个给出 numeric
所以它更粗糙。
> mode(1L)
[1] "numeric"
> storage.mode(1L)
[1] "integer"
> mode(1)
[1] "numeric"
> storage.mode(1)
[1] "double"
最好通过查看它们的来源来了解它们的操作。在这两种情况下,来源都很短。
例如,storage,mode
returns 与 typeof
相同的值,除非 typeof
返回的值是 "closure"
、"builtin"
或"special"
在这些情况下 returns "function"
.
storage.mode <- function (x)
switch(tx <- typeof(x), closure = , builtin = , special = "function", tx)