如何在不跟踪索引的情况下将元素附加到列表?

Posted

技术标签:

【中文标题】如何在不跟踪索引的情况下将元素附加到列表?【英文标题】:how to append an element to a list without keeping track of the index? 【发布时间】:2018-02-08 06:57:05 【问题描述】:

我正在寻找与python 中此简单代码等效的r

mylist = []
for this in that:
  df = 1
  mylist.append(df)

基本上只是创建一个空列表,然后将循环中创建的对象添加到其中。

我只看到 R 解决方案必须指定新元素的索引(比如 mylist[[i]] <- df),因此需要在循环中创建索引 i

有没有比在最后一个元素后面追加更简单的方法。

【问题讨论】:

比较appendcrfunction.com/archives/2087 【参考方案1】:

有一个函数叫append

ans <- list()
for (i in 1992:1994)
n <- 1 #whatever the function is
ans <- append(ans, n)


  ans
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 1
## 
## [[3]]
## [1] 1
## 

注意:使用 apply 函数而不是 for 循环更好(不一定更快),但这取决于循环的实际目的。

回答 OP 的评论:关于使用 ggplot2 并将绘图保存到列表中,这样的事情会更有效:

plotlist <- lapply(seq(2,4), function(i) 
            require(ggplot2)
            dat <- mtcars[mtcars$cyl == 2 * i,]
            ggplot() + geom_point(data = dat ,aes(x=cyl,y=mpg))
)

感谢@Wen分享Comparison of c() and append() functions:

连接 (c) 非常快,但 append 更快,因此在仅连接两个向量时更可取。

【讨论】:

难以置信。没找到。无论df 可能是什么,这都会起作用吗?它可能不是标量,而是整个数据框或 ggplot @ℕʘʘḆḽḘ 检查更新。第一个适用于标量或非标量。 @Masoud 等一下。如果您查看 append() 函数的 R 代码,它只是执行:c(x, values)append()怎么会比c()快??? append() 方法应该给出与 c() 相同的结果... @DamianoFantini 我不确定查看functionBody() 的输出是否是比较函数性能的正确方法。您可能想使用microbenchmark::microbenchmark() 并比较它们。 你是对的。我比较了这里提出的 3 种方法。 append() 确实是最慢的。【参考方案2】:
mylist <- list()
for (i in 1:100)
  n <- 1
  mylist[[(length(mylist) +1)]] <- n

在我看来,这似乎是更快的解决方案。

x <- 1:1000

aa <- microbenchmark(xx <- list(); for(i in x) xx <- append(xx, values = i) ) 
bb <- microbenchmark(xx <- list(); for(i in x) xx <- c(xx, i)  )
cc <- microbenchmark(xx <- list(); for(i in x) xx[(length(xx) + 1)] <- i  )

sapply(list(aa, bb, cc), (function(i) median(i[["time"]]) / 10e5 ))
#append=4.466634 #c=3.185096 #this.one=2.925718

【讨论】:

【参考方案3】:
mylist <- list()
for (i in 1:100) 
     df <- 1
     mylist <- c(mylist, df)

【讨论】:

【参考方案4】:

有:mylist &lt;- c(mylist, df),但这通常不是 R 中推荐的方式。根据您要实现的目标,lapply() 通常是更好的选择。

【讨论】:

【参考方案5】:

使用

first_list = list(a=0,b=1)
newlist = c(first_list,list(c=2,d=3))

print(newlist)

$a [1] 0

$b [1] 1

$c [1] 2

$d [1] 3


这是一个例子:

glmnet_params = list(family="binomial", alpha = 1,
type.measure = "auc",nfolds = 3, thresh = 1e-4, maxit = 1e3)

现在:

glmnet_classifier = do.call("cv.glmnet",
    c(list(x = dtm_train, y = train$target), glmnet_params))

【讨论】:

以上是关于如何在不跟踪索引的情况下将元素附加到列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新索引的情况下将项目添加到 laravel 列表集合中?

如何在不导致复制的情况下将 char 数据附加到 std::vector

是否可以在不先列出列表的情况下将 Series 附加到 DataFrame 行?

附加函数将元素添加到列表成员

如何在不删除旧文档的情况下将 XMLDocument 附加到 LocalStorage

如何在不手动滚动的情况下将 HMSegmentedControl 水平滚动到所选索引