R存储具有多种功能的lapply输出

时间:2015-01-11 13:25:15

标签: r apply lapply

我正在使用lapply循环遍历数据帧列表并应用同一组函数。当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(将每个数据集的结果显示在一起,而不是按顺序显示每个数据集的每个函数输出)。

2 个答案:

答案 0 :(得分: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将最终结果输出到大数据框。或者你可以使用经典:

do.call(rbind,output)

汇总结果。

答案 1 :(得分: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是一个列表清单。