imap() - return 结果在 R 中的列表中

imap() - return results in list in R

大多数包含的代码都具有可重复性,我的问题是关于从 imap() 函数导出结果。

我写了一些函数来聚合和汇总我的数据,如下所示。它创建一个列表,其中包含多个列表 - 每个齿轮一个列表。

splitCars <- split(mtcars, mtcars$cyl)

summarizeMtcarsYearly <- function(x)
{
  #Ngears
  v1 <- length(unique(x$gear))
  v2 <- paste0(unique(levels(as.factor(x$gear))),collapse = ', ')
  #Build data
  y <- data.frame(Ngears=v1,gears=v2,stringsAsFactors = F)
  return(y)
}

summarizeMtcars <-function(){

  splitCars <- split(mtcars, mtcars$cyl)
  splitCars <- lapply(splitCars,summarizeMtcarsYearly)

}

splitCars <- summarizeMtcars()

我想为列表中的每个齿轮创建摘要 table。我还为此编写了一个函数(如下)。细节并不重要,这只是为了可重复性。此功能的重要部分是我将 table 导出到结果文件夹的位置 - 最后 5 行

createSummaryTable <- function(x, y){
  
  tab <- plot_ly(
    type = 'table',
    header = list(
    values = c(paste0("Gears = "), y, ""),
    align = c('left', rep('center')),
    line = list(width = 1, color = 'black'),
    fill = list(color = 'rgb(235, 100, 230)'),
    font = list(family = "Arial", size = 14, color = "white")
    ),
      cells = list(
      values = rbind(c('number of gears', 'list of gears'),
                     c(x$Ngears, x$gears)),
      align = c('left', rep('center')),
      line = list(color = "black", width = 1),
      fill = list(color = c('rgb(235, 193, 238)', 'rgba(228, 222, 249, 0.65)')),
      font = list(family = "Arial", size = 12, color = c("black"))
    ))
  
  
  test_dir <- "/Users/testFolder"

  tab <- plotly_json(tab, FALSE)
  tabName <- paste0("summaryVariables_gear_TEST", y, ".json" )
  write(tab, paste0(test_dir, "/", tabName))
  
}

我假装不知道我的数据会有多少个档位然后我使用 imap() 函数将 createSummaryTable 应用到列表的每个元素,并将其直接导出到预定义的文件夹:

splitCars <- summarizeMtcars()
imap(splitCars, function(x, y) createSummaryTable(x,y))

完全按照我想要的方式工作。但是,现在,我需要 return 列表中每个齿轮的所有 table,如下所示:

createSummaryTable <- function(x, y){

  tab <- ... # this is the same as before


  tabname <- paste0("summary_", y)
  assign(tabname, tab)

}

analysis.summaryTables <- function(){
  
  # create tables
    splitCars <- summarizeMtcars()
    imap(splitCars, function(x, y) createSummaryTable(x,y))
  
  # append all tables to one list
  tables <- ls(patter = "summary_")
  out <- do.call(c,list(tables))
  
  
}

然而当我运行这个

summaryTables <- analysis.summaryTables()

summaryTable 只是一个空字符串。

如何将 imap() 的所有输出存储在 R 的单个列表中??

如何访问函数 createSummaryTable 环境中的元素并将它们附加到 R 中?

如果我没理解错的话,你有一个创建对象的函数 createSummaryTable,具体来说是一个 table。

你有一个命名数据框列表,你想将这个列表映射到你的函数到return一个对象列表(具体来说是tables的列表),它们的名字将相同,但“summary_”必须出现在前面。

因此:

createSummaryTable <- function(x, y){

  # do something here

  return(tbl)

}

# map your list
out <- purrr::imap(list_of_named_dataframes, createSummaryTable)
names(out) <- paste("summary", names(out), sep = "_")

out 就是您要找的。