我不推薦它,但你可以這樣做:lapply(myList, 'attr<-', which='myname', value='myStaticName')
。一個老式的for
循環可能是執行這個任務的最明確的方式 - 或者在創建對象時向上遊執行此任務。
for (i in seq_along(myList)) attr(myList[[i]], 'myname') <- 'myStaticName'
編輯:
如@mnel評價指出,setattr
在data.table
包也一個有效的選項,因爲它分配由參考。
編輯:@mnel - 不要與lapply
一起使用setattr。這是for
循環快得多的一種情況。
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)
![enter image description here](https://i.stack.imgur.com/Ilwt5.png)
+1,喜歡你的編輯,謝謝。比我的快。你爲什麼不推薦它?僅僅因爲它沒有性能問題,而且更透明? –
@ hans0l0是的,我不認爲第一眼看起來這個叫'lapply'的結果是顯而易見的。我想這取決於誰在維護你的代碼。在R中編寫混淆代碼非常容易。我認爲額外的輸入有時候值得清晰。 –
您也可以使用'data.table'或'bit'包中的'setattr',它將通過引用來設置屬性,因此基本上是瞬時的。 – mnel