我开发了一个闪亮的应用程序,在不同的选项卡下包含几个绘图和数据。选项卡是使用另一个参数动态创建的。但每次我都必须对数据进行子集化以准备绘图。假设使用“mpg”子集数据,我在“mpg”选项卡中绘制了两种不同类型的图表,并且我不想在绘制绘图时每次都对数据进行子集化(目前我每次都进行子集化)。对于一个选项卡中的所有计算,我只想对数据进行一次子集化。感谢一些帮助
write.csv(mtcars,'mtcars.csv')
write.csv(mtcars,'mtcars.csv')
library(shiny)
library(plyr)
library(dplyr)
library(DT)
library(data.table)
ui <- pageWithSidebar(
headerPanel = headerPanel('data'),
sidebarPanel = sidebarPanel(fileInput(
'mtcars', h4('Uplaodmtcardata in csv format')
),
uiOutput('tabnamesui')),
mainPanel(uiOutput("tabsets"))
)
server <- function(input, output, session) {
mtcarsFile <- reactive({
input$mtcars
})
xxmtcars <-
reactive({
read.table(
file = mtcarsFile()$datapath,
sep = ',',
header = T,
stringsAsFactors = T
)
})
tabsnames <- reactive({
names(xxmtcars())
})
output$tabnamesui <- renderUI({
req(mtcarsFile())
selectInput(
'tabnamesui',
h5('Tab names'),
choices = as.list(tabsnames()),
multiple = T
# selected = SalesGlobalDataFilter1Val()
)
})
tabnamesinput <- reactive({
input$tabnamesui
})
output$tabsets <- renderUI({
req(mtcarsFile())
tabs <-
reactive({
lapply(tabnamesinput(), function(x)
tabPanel(title = basename(x)
,fluidRow(splitLayout(cellWidths = c("50%", "50%"),
plotOutput(paste0('plot1',x)),
plotOutput(paste0('plot2',x)
))),fluidRow(splitLayout(cellWidths =
c("50%", "50%"),
plotOutput(paste0('plot3',x)),
plotOutput(paste0('plot4',x)
))),
dataTableOutput(paste0('table',x))))
})
do.call(tabsetPanel, c(tabs()))
})
observe(
lapply(tabnamesinput(), function(x) {
output[[paste0('table',x)]] <-
renderDataTable({as.data.table((select(xxmtcars(),x)))#CODE REPEATED
})}))
observe(
lapply(tabnamesinput(), function(x) {
output[[paste0('plot1',x)]] <-
renderPlot({as.data.table((select(xxmtcars(),x)))%>%plot()#CODE REPEATED
})
})
)
observe(
lapply(tabnamesinput(), function(x) {
output[[paste0('plot2',x)]] <-
renderPlot({as.data.table((select(xxmtcars(),x)))%>%plot()#CODE #REPEATED
})
})
)
observe(
lapply(tabnamesinput(), function(x) {
output[[paste0('plot3',x)]] <-
renderPlot({as.data.table((select(xxmtcars(),x)))%>%plot()#CODE REPEATED
})
})
)
observe(
lapply(tabnamesinput(), function(x) {
output[[paste0('plot4',x)]] <-
renderPlot({as.data.table((select(xxmtcars(),x)))%>%plot()#CODE REPEATED
})
})
)
}
runApp(list(ui = ui, server = server))