好的,这是我迄今为止从回复中收集到的信息:
Question
如何拥有不同类型的矩阵?
Answer
你不能;元素不是不同的类型;该矩阵的所有 (4) 个元素都是列表
all(
is.list(m_list[1,1]),
is.list(m_list[2,1]),
is.list(m_list[1,2]),
is.list(m_list[2,2]))
#[1] TRUE
Question
但我构建了这样的矩阵:matrix(list('1',2,3,4),2,2)
,这怎么变成了 (4) 的矩阵lists,而不是 (4) 的矩阵人物,甚至 (4)integers?
Answer
我不知道。尽管文档说 re:矩阵的第一个参数:
非原子类 R 对象由 as.vector 和所有强制
属性被丢弃。
看来这些是相同的
identical(as.vector(list('1',2,3,4)), list('1',2,3,4))
#[1] TRUE
Question
但我分配了一个字符('4'
) 到一个元素m_list
, 这是如何运作的?
m_list[2,2] <-'4'
Answer
它是“强制的”,就好像你这样做了:
m_list[2,2] <- as.list('4')
Question
如果元素在m_list
是列表,m_list 等价于matrix(c(list('1'),list(2),list(3),list(4)),2,2)
?
Answer
是的,这些是等效的:
m_list <- matrix(list('1',2,3,4),2,2)
m_list2 <- matrix(c(list('1'),list(2),list(3),list(4)),2,2)
identical(m_list, m_list2)
#[1] TRUE
Question
那么我怎样才能检索typeof
the '1'
隐藏在m_list[1,1]
?
Answer
至少有两种方式:
typeof(m_list[1,1][[1]])
#[1] "character"
...或者,可以直接这样做(谢谢,弗兰克)(因为索引有这个“依次应用于列表、选定的组件、该组件的选定组件等” https://stackoverflow.com/a/1169495/1175496行为)...
typeof(m_list[[1,1]])
#[1] "character"
Question
我怎样才能区分这两者之间的区别
m1 <- matrix(c(list(1), list(2), list(3), list(4)), 2, 2)
m2 <- matrix(1:4, 2, 2)
Answer
如果您使用的是 RStudio,
- m1 被描述为
List of 4
- m2 被描述为
int [1:2, 1:2] 1 2 3 4
..或者,只需使用 typeof(),它对于向量和矩阵,标识其元素的类型...(谢谢,马丁)
typeof(m1)
#[1] "list"
typeof(m2)
#[1] "integer"
class
也可以帮助区分,但必须先将矩阵包装在向量中:
#Without c(...)
class(m1)
#[1] "matrix"
class(m2)
#[1] "matrix"
#With c(...)
class(c(m1))
#[1] "list"
class(c(m2))
#[1] "integer"
...你可以看出控制台输出的细微差别;注意 m2 (包含整数)如何右对齐其元素(因为数字通常是右对齐的)...
m1
# [,1] [,2]
#[1,] 1 3
#[2,] 2 4
m2
# [,1] [,2]
#[1,] 1 3
#[2,] 2 4