2015-01-11 3 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' is просто ярлык для 'list', не так ли? – agstudy

+0

@agstudy, выход представляет собой вектор для каждого аргумента в списке, а не список для каждого аргумента в списке. Попробуйте 'lapply (nbs, function (x) {nbsout1 <-typeof (x); nbsout2 <-length (x); c (nbsout1, nbsout2)})' –

Смежные вопросы