3 回答
TA贡献1828条经验 获得超13个赞
只是为了解决您问题的最后一部分,因为这实际上指出了R list和vectorR 之间的区别:
为什么这两个表达式不能返回相同的结果?
x = list(1、2、3、4); x2 =列表(1:4)
列表可以包含任何其他类作为每个元素。因此,您可以拥有一个列表,其中第一个元素是字符向量,第二个元素是数据帧,等等。在这种情况下,您创建了两个不同的列表。 x有四个向量,每个向量的长度为1。 x2有1个向量的长度为4:
> length(x[[1]])
[1] 1
> length(x2[[1]])
[1] 4
所以这些是完全不同的列表。
R列表非常类似于哈希映射数据结构,因为每个索引值都可以与任何对象关联。这是一个包含3个不同类(包括一个函数)的列表的简单示例:
> complicated.list <- list("a"=1:4, "b"=1:3, "c"=matrix(1:4, nrow=2), "d"=search)
> lapply(complicated.list, class)
$a
[1] "integer"
$b
[1] "integer"
$c
[1] "matrix"
$d
[1] "function"
鉴于最后一个元素是搜索功能,我可以这样称呼它:
> complicated.list[["d"]]()
[1] ".GlobalEnv" ...
作为对此的最后评论:应该注意,a data.frame实际上是一个列表(来自data.frame文档):
数据框是具有给定类'“ data.frame”'的具有相同行名称的具有相同行数的变量的列表
因此,a中的列data.frame可以具有不同的数据类型,而矩阵中的列则不能。例如,在这里我尝试创建一个由数字和字符组成的矩阵:
> a <- 1:4
> class(a)
[1] "integer"
> b <- c("a","b","c","d")
> d <- cbind(a, b)
> d
a b
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
[4,] "4" "d"
> class(d[,1])
[1] "character"
请注意我如何无法将第一列的数据类型更改为数字,因为第二列具有字符:
> d[,1] <- as.numeric(d[,1])
> class(d[,1])
[1] "character"
TA贡献2003条经验 获得超2个赞
关于您的问题,让我依次解决并举例:
1)如果return语句添加一个列表,则返回一个列表。考虑
R> retList <- function() return(list(1,2,3,4)); class(retList())
[1] "list"
R> notList <- function() return(c(1,2,3,4)); class(notList())
[1] "numeric"
R>
2)根本没有设置名称:
R> retList <- function() return(list(1,2,3,4)); names(retList())
NULL
R>
3)他们不会返回相同的东西。你的例子给出
R> x <- list(1,2,3,4)
R> x[1]
[[1]]
[1] 1
R> x[[1]]
[1] 1
其中x[1]返回的第一个元素x-这是一样的x。每个标量都是一个长度为1的向量。另一方面,x[[1]]返回列表的第一个元素。
4)最后,两者之间是不同的,它们分别创建了一个包含四个标量的列表和一个包含单个元素的列表(碰巧是四个元素的向量)。
分享编辑
- 3 回答
- 0 关注
- 708 浏览
添加回答
举报