В моем приложении Shiny есть раздел, который генерирует список.
имена в списке являются именами столбцов dataframe
, на которые мы будем рассчитывать,
элементы списка содержат расчеты, которые мы хотим
Хотите сделать это:
apply
ко всем list
именам:
для listname
(column
) x рассчитать function
n,m,o
более df column
x
и назовите получившийся столбец 'x.n
', т.е. cyl.mean'
, 'mpg.sum
'
чтобы получить dataframe
сводной статистики на группу (mtcars $ cyl) в этом случае как пример
Он связан с этим вопросом, но в этом примере data
использовал отдельные list
из column
имен, и apply
одинаковые functions
для всех этих columns
от другого list
. Я с нетерпением жду перехода к apply
unique
наборам functions
к другим columns
Список, который выкладывает мое приложение, выглядит следующим образом:
mylist
$disp
[1] "sum" "mean"
$hp
[1] "sd"
$drat
[1] "sum" "mean"
$wt
[1] "max"
ожидаемый результат:
cyl disp.sum hp.sd drat.sum drat.mean wt.max
4 x ....
6 x ....
8 x ....
Маленькое блестящее приложение для создания списка:
library(shiny)
library(data.table)
library(shinyjs)
Channels <- names(mtcars)[3:8]
ui <- fluidPage(
shinyjs::useShinyjs(),
h5('Channels', style = 'font-weight:bold'),
uiOutput('ChannelCheckboxes'),
h5('Statistics', style = 'font-weight:bold'),
uiOutput('CalculationCheckboxes')
)
server <- function(input, output, session) {
values <- reactiveValues(Statisticlist = list())
## build observer to deselect all sub category checkboxes if channel is deselected
lapply(Channels, function(x) {
observeEvent(input[[paste('Channel', x, sep = '')]], {
if(!input[[paste('Channel', x, sep = '')]]) {
shinyjs::disable(paste("Calculations", x, sep = ''))
updateCheckboxGroupInput(session, inputId = paste("Calculations", x, sep = ''), selected=character(0))
} else {
shinyjs::enable(paste("Calculations", x, sep = ''))
}
})
})
output$ChannelCheckboxes <- renderUI({
fluidRow(
lapply(Channels, function(x) {
column(2,
checkboxInput(inputId = paste('Channel', x, sep = ''), label = x)
)
})
)
})
output$CalculationCheckboxes <- renderUI({
fluidRow(
lapply(Channels, function(x) {
column(2,
checkboxGroupInput(inputId = paste("Calculations", x, sep = ''), label = NULL, c('sum', 'mean', 'length', 'max', 'min', 'sd')) ) })
)
})
lapply(Channels, function(x) {
observe({
req(input[[paste('Channel', x, sep = '')]])
if(input[[paste('Channel', x, sep = '')]] & !is.null(input[[paste("Calculations", x, sep = '')]])){
values$Statisticlist[[paste(x)]] <- input[[paste("Calculations", x, sep = "")]]
}
})
})
observeEvent(values$Statisticlist, { print(values$Statisticlist)
mylist <<- values$Statisticlist
})
}
shinyApp(ui, server)