web-dev-qa-db-ja.com

インデックスを追跡せずにリストに要素を追加する方法

rpython のこの単純なコードに相当するものを探しています

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

基本的には空のリストを作成し、ループ内で作成されたオブジェクトをそれに追加します。

私は、新しい要素のインデックスを指定する必要があるRソリューションのみを見ました(たとえば、mylist[[i]] <- df)、したがって、ループでインデックスiを作成する必要があります。

最後の要素の直後に追加するより簡単な方法はありますか?.

7

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
## 
_

注:forループの代わりにapply関数を使用することをお勧めしますが、状況によって異なりますループの実際の目的。

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 の共有に感謝 c()append() functionsの比較

連結(c)はかなり高速ですが、2つのベクトルだけを連結する場合は、追加がさらに高速になるため、追加することをお勧めします。

10
M--
mylist <- list()
for (i in 1:100) {
     df <- 1
     mylist <- c(mylist, df)
}
3
CPak

あります:mylist <- c(mylist, df)ですが、通常はRでの推奨方法ではありません。達成しようとしていることに応じて、lapply()がより良いオプションであることがよくあります。

3
Aurèle
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
2
Damiano Fantini

前のコメントを明確にする

使用する

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))
0
Yanni Papadakis