12

我正在尝试在 R 中增加一个列表,其中每个条目的值和名称都保存在一个变量中,但它似乎不起作用。

my_models_names <- names(my_models)
my_rocs=list() 
for (modl in my_models_names) {

    my_probs <- testPred[[modl]]$Y1
    my_roc <- roc(Ytst, my_probs)
    c(my_rocs, modl=my_roc) # <-- modl and my_roc are both variables
    }

我的列表my_rocs最后是空的,即使我知道循环迭代(my_roc填充)为什么?

在相关说明中,有没有办法在不循环的情况下做到这一点?

4

3 回答 3

21

通常在 R 中,增长的对象是不好的。与从完整对象开始并填充它相比,它增加了使用的内存量。似乎您事先知道列表的大小应该是多少。

例如:

my_keys <- letters[1:3]
mylist <- vector(mode="list", length=length(my_keys))
names(mylist) <- my_keys

mylist
## $a
## NULL

## $b
## NULL

## $c
## NULL

您可以通过以下方式进行分配:

key <- "a"
mylist[[key]] <- 5
mylist
## $a
## [1] 5
##
## $b
## NULL
##
## $c
## NULL
于 2013-02-11T07:24:11.870 回答
7

我在这个线程上找到了答案。

我可以使用以下通用公式扩展列表:

mylist <- list()

for (key in my_keys){ 
mylist[[ key ]] <- value # value is computed dynamically
}

在我的操作中:

  • mylistmy_rocs
  • keymodl
  • valuemy_roc
于 2013-02-10T18:39:17.643 回答
3

您还可以使用更类似于 R 的解决方案,并使用lapply

get_model = function(model_name) {
    my_probs <- testPred[[model_name]]$Y1
    return(roc(Ytst, my_probs))
  }
model_list = lapply(names(my_models), get_model)

Note that this solution saves you a lot of boilerplate code, it also does not suffer from the reallocation problem of your solution by growing the object. For large datasets, this can mean that the lapply solution is thousands of times faster.

于 2013-02-11T07:44:39.120 回答