【问题标题】:imap() - return results in list in Rimap() - 在 R 的列表中返回结果
【发布时间】:2021-01-14 22:29:37
【问题描述】:

包含的大部分代码都具有可重复性,我的问题是关于从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()

对于列表中的每个齿轮,我想创建汇总表。我还为此编写了一个函数(如下)。细节并不重要,这只是为了重现性。此功能的重要部分是我将表格导出到结果文件夹 - 最后 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))

这正是我想要的方式。但是,现在,我需要返回列表中每个齿轮的所有表格,如下所示:

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 中?

【问题讨论】:

  • imap 中的第二个参数是名称的字符串。如果我从您的代码中正确理解,您正在使用它们。
  • 我很害怕我不明白你的意思@Edo。你介意更详细地解释一下吗?
  • tabname &lt;- paste0("summary_", x) 不应该是tabname &lt;- paste0("summary_", y) 吗?
  • 哦,当然,你是对的
  • 你的例子真的很长,只是在imap上提问。你确定不能缩短吗?

标签: r list environment-variables apply


【解决方案1】:

如果我理解正确的话,你有一个函数createSummaryTable 创建一个对象,一个具体的表。

您有一个命名数据框列表,并且您希望将此列表映射到您的函数以返回对象列表(具体的表列表),其中它们的名称将相同但“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 就是您要查找的内容。

【讨论】:

  • 我确实需要 imap 函数,因为在 createSummaryTable 内部我使用索引来命名每个表
  • 我改变了答案。但我仍然认为您应该使用names&lt;- 单独编辑列表名称。
  • 结果对你有用吗?我已经实现了它,但是我得到了一个包含 3 个元素的字符向量
  • 哦,我的错...通过省略纬线names(out) &lt;- paste("summary", names(out), sep = "_") 我得到了桌子,我可以使用它。这么简单的解决方案!
  • 如果你把最后两行放在一个包装函数中,你需要在最后写outreturn(out)。否则,您将得到names(out) 作为输出,因为这是最后一个不可见地返回的元素。小心这种东西。
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2016-08-23
  • 2022-07-29
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多