Имам лъскаво приложение, което се състои от много части, които са еднакви, с изключение на това, че работят върху различни части от набор от данни. Ето пример за играчка, който манипулира и показва две подмножества от първоначален набор от данни независимо:
# app.R
library(shinydashboard)
df <- data.frame(
id = 1:10,
group = rep(c("A", "B"), times = 5),
val = seq(1, 100, 10)
)
ui <- fluidPage(
fluidRow(
numericInput(
"A_multiplier",
"Multiplier:",
value = 1
),
tableOutput("A_table")
),
fluidRow(
numericInput(
"B_multiplier",
"Multiplier:",
value = 1
),
tableOutput("B_table")
)
)
server <- function(input, output) {
A_data <- reactive({
df <- df[df$group == "A", ]
df$val <- df$val * input$A_multiplier
df
})
output$A_table <- renderTable(A_data())
B_data <- reactive({
df <- df[df$group == "B", ]
df$val <- df$val * input$B_multiplier
df
})
output$B_table <- renderTable(B_data())
}
shinyApp(ui = ui, server = server)
Това е много повторение на кода и става много трудно за поддържане, тъй като броят на групите се увеличава.
Това, което искам да направя, е да напиша функции за генериране на кода ui
и server
въз основа на групите, наблюдавани в първоначалния df
, третирайки всяка група по същия начин.
За ui
това е доста лесно; Мога да заменя блока ui
със следното:
MakeGroupElements <- function(group) {
namer <- function(name) paste(group, name, sep = "_")
fluidRow(
numericInput(
namer("multiplier"),
"Multiplier:",
value = 1
),
tableOutput(namer("table"))
)
}
ui <- do.call(fluidPage, lapply(unique(df$group), MakeGroupElements))
да създава същото приложение като преди по по-лесен за поддръжка начин.
Това, което не мога да разбера, е как по подобен начин да преработя сървърната страна. Щеше да е лесно, ако нямах необходимите данни, но ми е трудно да се справя правилно с реактивността.
Как мога да преработя блока server
, за да предотвратя повторение на кода?
Пояснение:
Първоначално пропуснах да спомена, че отделих генерирането на данни от renderTable
извикванията, тъй като в моето реално приложение имам множество изходи (таблици, диаграми, бутони и т.н.), които реактивно зависят от груповия поднабор данни, така че идеалното решение ще позволи такова разширение.
server
по гъвкав, поддържаем начин, подобен на начина, по който преработих странатаui
по-горе. - person ClaytonJY   schedule 14.01.2016