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
就是您要找的。
大多数包含的代码都具有可重复性,我的问题是关于从 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
就是您要找的。