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

R store output from lapply with multiple functions

我正在使用 lapply 循环遍历数据帧列表并应用相同的函数集。这在 lapply 只有一个函数时工作正常,但我正在努力查看我如何 store/print 多个函数的输出 - 在这种情况下,我似乎只能从一个 [=27= 获得输出].

所以这个:

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,然后将打印 outputs/knitting html(将每个数据集的结果一起显示而不是按顺序显示每个数据集的每个函数输出是有意义的) .

函数应始终具有明确的 return 值,例如

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 是列表的列表。

您应该return 一个包含所有输出的结构。最好 return 命名列表。如果您的输出具有所有相同的维度,您也可以 return a 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) 
})

当你 return 一个 data.frame 时,你可以使用 sapply 简单地将最终结果输出到一个大的 data.frame。或者你可以使用经典的:

do.call(rbind,output)

汇总结果。