Трудно однозначно комментировать без реального кода, но здесь есть ссылка на некоторые хорошие ресурсы по реактивному программированию.
https://www.rstudio.com/resources/webinars/shiny-developer-conference/
Первые 2 видео - золотая жила.
Как правило, в вашем приложении никогда не должно быть повторяющегося кода.И я не понимаю, почему вам потребовалось бы несколько реактивных функций, когда ваше оригинальное приложение имеет повторяющийся код.
Первый шаг к планированию любого приложения - это иметь в виду (или на бумаге) наличие реактивных зависимостей, т.е.От чего inputs
зависит мой outputs
.
Во-вторых, рассмотрим вопрос «какой код является общим для всех графиков?».Поскольку существует несколько графиков, основное предположение состоит в том, что что-то должно измениться, чтобы создать разные графики.Мы берем весь код до этой точки и можем называть его «общим кодом».
Наконец, мы объединяем первые две точки, обеспечивая сохранение зависимостей без избыточного кода.
Здесьпростой пример с избыточным кодом.
Код избыточности
library(shiny)
library(dplyr)
data = mtcars
shinyApp(ui = {
fluidPage(
sliderInput("selectHP","Select Horse Power",min(data$hp),max(data$hp),data$hp),
sliderInput("selectCyl","Select Cylinders",min(data$cyl),max(data$cyl),data$cyl),
sliderInput("mpg","Select MPG Range",min(data$mpg),max(data$mpg),data$mpg),
plotOutput("hp_mpg"),
plotOutput("cyl_mpg")
)
},
server = function(input,output){
output$hp_mpg = renderPlot({
#Shared Code
data = data%>%
filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
filter(between(mpg,input$mpg[1],input$mpg[2]))
plot(data$hp,data$mpg)
})
output$cyl_mpg = renderPlot({
#Shared Code
data = data%>%
filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
filter(between(mpg,input$mpg[1],input$mpg[2]))
plot(data$hp,data$cyl)
})
})
Удалена избыточность
library(shiny)
library(dplyr)
data = mtcars
shinyApp(ui = {
fluidPage(
sliderInput("selectHP","Select Horse Power",min(data$hp),max(data$hp),data$hp),
sliderInput("selectCyl","Select Cylinders",min(data$cyl),max(data$cyl),data$cyl),
sliderInput("mpg","Select MPG Range",min(data$mpg),max(data$mpg),data$mpg),
plotOutput("hp_mpg"),
plotOutput("cyl_mpg")
)
},
server = function(input,output){
data_reactive = reactive({
data = data%>%
filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
filter(between(mpg,input$mpg[1],input$mpg[2]))
return(data)
})
output$hp_mpg = renderPlot({
plot(data_reactive()$hp,data_reactive()$mpg)
})
output$cyl_mpg = renderPlot({
plot(data_reactive()$hp,data_reactive()$cyl)
})
})