2015-01-11 105 views
2

我正在使用lapply循環訪問數據框列表並應用相同的功能集。當lapply只有一個函數時,這工作正常,但我很努力地看到我如何存儲/打印多個函數的輸出 - 在這種情況下,我似乎只從一個「循環」獲得輸出。R存儲從多功能lapply輸出

所以這個:

output <- lapply(dflis,function(lismember) vss(ISEQData,n=9,rotate="oblimin",diagonal=F,fm="ml")) 

作品,而下面沒有:

output <- lapply(dflis,function(lismember){ 
outputvss <- vss(lismember,n=9,rotate="oblimin",diagonal=F,fm="ml") 
nefa <- (EFA.Comp.Data(Data=lismember, F.Max=9, Graph=T)) 
}) 

我覺得這個虛擬的例子是模擬的,所以換句話說:

nbs <- list(1==1,2==2,3==3,4==4) 
nbsout <- lapply(nbs,function(x) length(x)) 

給了我一些我可以訪問的東西,而我看不到如何使用下面的方式存儲輸出(例如嘗試使用nbsout [[x]] [2 ]):

nbs <- list(1==1,2==2,3==3,4==4) 
nbsout <- lapply(nbs,function(x){ 
    nbsout[[x]][1]<-typeof(x) 
    nbsout[[x]][2]<-length(x) 
    } 
       ) 

我使用RStudio和將被打印輸出/針織的HTML(其中是有意義的顯示從每個數據集的結果一起,而不是每個功能輸出每個數據集順序地)。

回答

3

您應該返回一個包含所有輸出的結構。最好返回一個命名列表。如果輸出具有相同的尺寸,您也可以返回data.frame。

otutput <- lapply(dflis,function(lismember){ 
    outputvss <- vss(lismember,n=9,rotate="oblimin",diagonal=F,fm="ml") 
    nefa <- (EFA.Comp.Data(Data=lismember, F.Max=9, Graph=T)) 

    list(outputvss=outputvss,nefa=nefa) 
    ## or data.frame(outputvss=outputvss,nefa=nefa) 
}) 

當您返回一個data.frame您可以使用sapply,僅僅輸出最終結果來個大data.frame。或者你可以使用經典的:

do.call(rbind,output) 

來彙總結果。

2

函數應該總是有一個明確的返回值,例如

output <- lapply(dflis,function(lismember){ 
    outputvss <- vss(lismember,n=9,rotate="oblimin",diagonal=F,fm="ml") 
    nefa <- (EFA.Comp.Data(Data=lismember, F.Max=9, Graph=T)) 
    #return value: 
    list(outputvss, nefa) 
}) 

output是列表的列表。

+0

我猜如果他們使用'c'而不是'list'將會更容易訪問這些值(至少對於他們可重複的例子,當結果只是每個函數的一個值) –

+0

@DavidArenburg'c'是隻是一個'list'的快捷方式,不是嗎? – agstudy

+0

@agstudy,輸出是列表中每個參數的一個向量,而不是列表中每個參數的列表。嘗試'lapply(nbs,function(x){nbsout1 <-typeof(x); nbsout2 <-length(x); c(nbsout1,nbsout2)})' –