3

Or put it more general: How can I add multiple attributes to the elements of list?

I am stuck trying to set an attribute to elements of a list all of which are data.frames. In the end I would like to add names(myList) as a varying attribute to every data.frame inside. But I even cannot get a static attribute for all list elements to go.

lapply(myList,attr,which="myname") <- "myStaticName"

This does not work because lapply does not work with lapply<-. If I had at least an idea how to do this, maybe I could figure out how to do it with varying attributes like the name of the list.

4

2 に答える 2

5

お勧めしませんが、次のことができますlapply(myList, 'attr<-', which='myname', value='myStaticName')。昔ながらのforループは、おそらくこのタスクを実行する最も明確な方法です。つまり、オブジェクトが作成されたときに上流でこの割り当てを行います。

for (i in seq_along(myList)) attr(myList[[i]], 'myname') <- 'myStaticName'

編集:

@mnel がコメントで指摘しているように、参照によって割り当てられるためsetattrdata.tableパッケージ内も効率的なオプションです。

編集: @mnel -- で setattr を使用しないでくださいlapply。これは、forループがはるかに高速な 1 つのケースです。

library(microbenchmark)
library(data.table)
myList <- as.list(1:10000)

`lapply.attr<-` <- 
    function() 
    lapply(myList, 'attr<-', which='myname', value='myStaticName')

`for.attr<-` <- 
    function() 
    for (i in seq_along(myList)) 
        attr(myList[[i]], 'myname') <- 'myStaticName'

lapply.setattr <- 
  function() 
  lapply(myList, setattr, name='myname', value='myStaticName')

for.setattr <- function() 
  for (i in seq_along(myList)) 
  setattr(myList[[i]], name = 'myname', value = 'myStaticName')

result <- microbenchmark(`lapply.attr<-`(), `for.attr<-`(), lapply.setattr(), for.setattr())
plot(result)

ここに画像の説明を入力

于 2012-11-28T21:21:26.433 に答える
1

this answer by Thierryに基づいて、私は自分で解決策を見つけました。実際、私は何度か試してみましたが、キーである WHOLE リストを返しませんでした。

myList <- lapply(names(myList),function(X){
attr(myList[[X]],"myname") <- X
myList[[X]]
})

私の間違いは、リスト全体ではなく、関数の 2 行目、つまり属性のみを返すことでした。したがって、最初のリストを置き換えることができませんでした。

@Matthew Plourde: 奇妙な点: RStudio、OS X、2.5 Ghz Intel Core i7、16GB RAM という私のマシンでは、ベンチマークが多少異なって見えます。 ここに画像の説明を入力

于 2012-11-28T21:29:30.087 に答える