【问题标题】:Unpacking lists programmatically in R在 R 中以编程方式解包列表
【发布时间】:2017-07-02 13:01:24
【问题描述】:

我正在 R 中对应用程序进行原型设计。我正在使用并行库和 parApply 在数据框的列上运行函数。我知道这也适用于非并行/应用应用程序。我有一行类似于:

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 的向量,或者是一个带有 col.names 的 data.frame。

这可能吗?我可以想到一个使用 for 循环的解决方案,但这似乎不太优雅。

我还想对返回的图做一些类似的事情,这样我就可以自动构建一个包含所有图的 pdf。我猜想学习以上内容会有所帮助。

tl;dr:从列表中提取常见数据名称的最佳方法是什么?

编辑:一个实际的 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)

【问题讨论】:

  • 试试mymeans &lt;- sapply(myBigList, `[[`, "mean"),其中“mean”是您要提取的每个子列表中元素的名称
  • 谢谢,对于我列表中具有单个值的项目,这将返回一个具有适当名称的向量。正是我想要的。对于我列表中包含向量的项目,这会返回一个向量列表,这也是非常可接受的。但是对于列表中包含绘图句柄的项目(可能不是正确的术语),它会返回一个矩阵。我似乎无法弄清楚如何从中再现情节。
  • 这就是为什么您应该提供一个最小的可重现示例。虽然您确实显示了一些代码,但它不允许用户实际测试/运行它。例如,您可以显示类似x &lt;- list(col1 = list(mean = 1, sd = 2),col2 = list(mean = 1, sd = 2),col3 = list(mean = 1, sd = 2) ) 的行或包含绘图和data.frames 的行。然后,有人会告诉你怎么做
  • 好建议,我添加了一个完整的例子。
  • 如果你想重新打印你可以使用lapply(myBigList, `[[`, "plot")。创建“vect”的data.frame,可以是as.data.frame(lapply(myBigList, `[[`, "vect"))..

标签: r list apply


【解决方案1】:

来自@docendo discusimus的评论

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

返回以均值形式存储的所有值的向量。要返回一个列表,这对于存储绘图类很有用,命令应该是:

myplots <- lapply(myBigList, '[[', 'plot')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2020-09-26
    • 2016-10-10
    • 2012-10-19
    • 2013-03-07
    相关资源
    最近更新 更多