问题 如何在R中创建列表向量?


我有一个列表(tmpList),如下所示:

$op
[1] "empty"

$termset
$termset$field
[1] "entry"

$termset[[2]]
$termset[[2]]$explode
[1] "Y"

这是一个列表,里面有一个列表。 如果我将此列表添加到矢量

theOneVector = c(theOneVector, tmpList)

现在结果向量的长度为2,因为列表的第一个条目(“op”)与tmpList分开。 是否可以将完整的tmpList附加到此向量中?
我已经试过了

theOneVector = c(theOneVector, list(tmpList))

它给出了一个长度为1的向量,但是使用列表周围的这个额外列表访问列表的元素非常麻烦。 (我认为,在一个句子中列出的太多了。)

任何帮助,将不胜感激,
马丁


1766
2018-04-12 19:28


起源



答案:


您可以将矢量(所有组件必须属于同一类型的受限制结构)粘贴到列表中(不受限制)。

但你无法做到相反。使用列表列表列表......然后使用lapply等提取。


12
2018-04-12 19:32



我认为这是因为R的向量只能有某种类型的“模式”:数字,字符,逻辑,复杂等,但它不能包含列表类型的元素。所以在这个意义上,R的向量与python的列表非常不同。后者可以存储任意类型的元素。 - wiswit
是的,我们知道。这部分由R's覆盖 list 就像七年前我的回答一样。 - Dirk Eddelbuettel
所以@wiswit:你的downvote是完全错误的。在R中,只能有一个数据结构 不同 类型: list。这是我七年前所说的。责备我(按设计)的限制 vector 只是表明你的误解。 - Dirk Eddelbuettel
@ Dirk Eddelbuettel:当然,我从你的回答中受益,对不起,投票只是一个错误。你知道怎么修这个? - wiswit
@wiswit:哦,不用担心是不是无意中。您可以只点击向下箭头。 - Dirk Eddelbuettel


答案:


您可以将矢量(所有组件必须属于同一类型的受限制结构)粘贴到列表中(不受限制)。

但你无法做到相反。使用列表列表列表......然后使用lapply等提取。


12
2018-04-12 19:32



我认为这是因为R的向量只能有某种类型的“模式”:数字,字符,逻辑,复杂等,但它不能包含列表类型的元素。所以在这个意义上,R的向量与python的列表非常不同。后者可以存储任意类型的元素。 - wiswit
是的,我们知道。这部分由R's覆盖 list 就像七年前我的回答一样。 - Dirk Eddelbuettel
所以@wiswit:你的downvote是完全错误的。在R中,只能有一个数据结构 不同 类型: list。这是我七年前所说的。责备我(按设计)的限制 vector 只是表明你的误解。 - Dirk Eddelbuettel
@ Dirk Eddelbuettel:当然,我从你的回答中受益,对不起,投票只是一个错误。你知道怎么修这个? - wiswit
@wiswit:哦,不用担心是不是无意中。您可以只点击向下箭头。 - Dirk Eddelbuettel


表达式'c(theOneVector,list(tmpList))'实际上没有返回长度为1的向量,它返回一个列表(通过coersion),因为向量中的项必须都是相同的模式(数据类型)。

以下是在R中创建容器的方法,该容器将保存不同模式的项目,并且其项目易于访问:

# create the container (an R 'list')
vx = vector(mode="list")

# create some items having different modes to put in it
item1 = 1:5
item2 = "another item"
item3 = 34
item4 = list(a = c(1:5), b = c(10:15))

# now fill the container 
vx$item1 = item1
vx$item2 = item2
vx$item3 = item3
vx$item4 = item4

# access the items in the container by name:
vx$item1
# returns: [1] 4 5 6
vx$item2
# returns: [1] "another item"

1
2018-04-12 19:57



或者更简洁:v1 < - list(item1 = 1:5,item2 =“other item”,item3 = 34,item4 = list(a = c(1:5),b = c(10:15)) - hadley


我想一个 list() 的 list() 是你想要的。

这是一个简单的例子 lapply() 它显示了如何使用它们。注意 lapply() 将应用提供给参数中给出的列表的每个元素的函数,并返回包含各个执行结果的列表。

> l1 = list(a = 10, b = 11)
> l2 = list(a = 20, b = 22)

> test_function <- function(l){
   return(paste("a =", l$a, "b = ", l$b, "\n"))
  }


# Do something to each element of the list 
# (i.e.: apply a function test_function() using lapply()). 
# This will return a list over which you can iterate.
# Each individual list l1 and l2 is "wrapped" into a single list: list(l1, l2)
> res = lapply(X = list(l1, l2), FUN = test_function)
> res
[[1]]
[1] "a = 10 b =  11 \n"

[[2]]
[1] "a = 20 b =  22 \n"

# First element of the results
> res[1]
[1] "a = 10 b =  11 \n"

# Second element of the results
> res[2]
[1] "a = 20 b =  22 \n"

0
2017-12-13 16:51