4

我在 r 中有 optim 函数,它返回如下内容列表:

[[354]]
    r     k sigma 
389.4 354.0 354.0 

但是当我尝试访问说 list$sigma 时,它不存在返回 NULL。

我试过附加,我试过名字,我试过把它分配给一个矩阵,但这些东西都不起作用列表??

非常感谢!!

str 给了我这个输出:

List of 354
 $ : Named num [1:3] -55.25 2.99 119.37
  ..- attr(*, "names")= chr [1:3] "r" "k" "sigma"
 $ : Named num [1:3] -53.91 4.21 119.71
  ..- attr(*, "names")= chr [1:3] "r" "k" "sigma"
 $ : Named num [1:3] -41.7 14.6 119.2

所以我在一个列表中的一个列表中有一个双精度(?)我仍然对如何循环遍历列表并选择一个满足我的条件而无需从头开始编写函数感到困惑

4

3 回答 3

10

关键问题是您有一个列表列表(或 data.frames 列表,实际上也是一个列表)。
要确认这一点,请查看is(list[[354]]).

解决方案只是添加一个额外的索引级别。下面您有多种选择来完成此操作。


您可以使用向量作为 的索引[[,例如,如果您想从第 354 个元素访问第三个元素,您可以使用

 myList[[ c(354, 3) ]]

您也可以使用字符索引,但是,所有嵌套级别都必须具有命名索引。

names(myList) <- as.character(1:length(myList))
myList[[ c("5", "sigma") ]]

最后,请尽量避免使用 , 等名称listdatadf将导致代码崩溃和错误,这看起来无法解释和神秘,直到人们意识到他们试图对函数进行子集化


编辑:

在上面的评论中回答您的问题:如果您想查看对象的结构(即对象的“构成”),请使用str

> str(myList)
List of 5
 $ :'data.frame': 1 obs. of  3 variables:
  ..$ a    : num 0.654
  ..$ b    : num -0.0823
  ..$ sigma: num -31
 $ :'data.frame': 1 obs. of  3 variables:
  ..$ a    : num -0.656
  ..$ b    : num -0.167
  ..$ sigma: num -49
 $ :'data.frame': 1 obs. of  3 variables:
  ..$ a    : num 0.154
  ..$ b    : num 0.522
  ..$ sigma: num -89
 $ :'data.frame': 1 obs. of  3 variables:
  ..$ a    : num 0.676
  ..$ b    : num 0.595
  ..$ sigma: num 145
 $ :'data.frame': 1 obs. of  3 variables:
  ..$ a    : num -0.75
  ..$ b    : num 0.772
  ..$ sigma: num 6
于 2013-03-03T20:20:16.863 回答
1

如果你想要 - 例如 - 所有的 sigma,你可以使用 sapply:

sapply(list, function(x)x["sigma"])

您可以使用它来找到最小值和最大值:

range(sapply(list, function(x)x["sigma"]))
于 2013-03-03T20:21:52.720 回答
0

使用 ,do.call您可以这样做:

 do.call('[',mylist,354)['sigma']
于 2013-03-03T20:36:03.850 回答