2017-02-14 5 views
0

Я прототипирую приложение в R. Я использую параллельную библиотеку и parApply для запуска функции на столбцах фрейма данных. Я понимаю, что это также применимо и к непараллельному/Прикладному приложению. У меня есть строка, похожая на:Распаковка списков progammatically в R

myBigList <- parApply(myCluster, myInputData, 2, myFunction) 

, где myFunction - это тот, который я написал, принимает вектор в качестве входа. Сама функция выполняет довольно много операций, в которые я не могу войти. Он возвращает список переменных из разных классов. Для целей в MWE, говорят:

myFunction <- function(vectorIn){ 
    # CODE GOES HERE 
    return(list(
     mean = mean(vectorIn), 
     sd = mean(vectorIn), 
     vectorOut = sumUserFunction(vectorIn), 
     plot1 = aPlotGeneratingFunction(vectorIn), 
    )) 

Что возвращается ко мне список, содержащий результаты функции. Я могу указать элементы из списка, например:

myBigList$Column1$mean 

Но это не очень полезно для моих целей. Я хотел бы знать, как распаковать список, чтобы я мог смотреть на все средние значения. например:

listOfMeans <- myBigList$*ALL_ITEMS*$mean 

так что listOfMeans вектор с row.names или data.frame с col.names.

Возможно ли это? Я могу думать о решении, используя цикл for, но это не кажется очень элегантным.

Я также хотел бы сделать что-то похожее на сюжеты, которые я возвращаю, чтобы автоматически создавать pdf-файлы, содержащие все из них. Я предполагаю, что изучение выше поможет.

tl; dr: Каковы наилучшие методы извлечения общих имен данных из списка?

EDIT: фактическая MWE

library('ggplot2') 

exampleData <- data.frame(Col1 = rnorm(100), Col2 = rnorm(100), Col3 = rnorm(100)) 

myFunction <- function(xIn){ 

    meanX <- mean(xIn) 
    sdX <- sd(xIn) 
    vecX <- xIn^2 + xIn 

    plotX <- 
    ggplot(data.frame(xIn, vecX), aes(x = xIn, y = vecX)) + 
    geom_point() 

    return(list(
    mean = meanX, 
    sd = sdX, 
    vect = vecX, 
    plot = plotX 
)) 
} 

myBigList <- apply(exampleData, 
        2, 
        myFunction) 
+2

Попробуйте 'mymeans <- sapply (myBigList, \' [[\ ', "означает")', где "значит" есть имя элемента в каждом подсписке, который вы хотите извлечь –

+0

Спасибо, Для элементов в моем списке с одиночными значениями возвращает вектор с соответствующими именами. Именно то, что я хотел. Для элементов в моем списке содержат векторы, это возвращает список векторов, опять же очень приемлемый. Но для элементов в списке, содержащих дескрипторы участков (возможно, не правильный термин), он возвращает матрицу. Я не могу понять, как это сделать. – Lespied

+0

Вот почему вы должны предоставить минимальный воспроизводимый пример. Пока вы показываете какой-то код, он не позволяет пользователям фактически тестировать/запускать его. Например, вы могли бы показать строку типа 'x <- list (col1 = list (mean = 1, sd = 2), col2 = list (mean = 1, sd = 2), col3 = list (mean = 1, sd = 2)) или один, включая графики и данные. Тогда кто-то скажет вам, как это сделать –

ответ

1

от @docendo discusimus комментария

mymeans <- sapply(myBigList, '[[', 'mean') 

возвращает вектор всех значений магазинов в среднем. Чтобы вернуть список, который является полезным для хранения класса участка команды должна быть:

myplots <- lapply(myBigList, '[[', 'plot') 
Смежные вопросы