Я пытался сделать свое первое блестящее приложение, используя данные из отчета World Happiness.Я хотел сделать 2 вкладки:
- График с использованием реактивных значений
- Таблица с использованием реактивных значений
Я почти преуспел, за исключением .. когда я запускаюВ коде сначала есть ошибка оценки, и она исчезает после того, как я нажимаю на кнопку действия.Думаю, мне нужны какие-то значения по умолчанию для графика и таблицы.
Есть ли способ избежать дублирования кода для вкладок?Могут ли они иметь одинаковые реактивные значения?Я попробовал, но таблица обновлялась только тогда, когда я нажимал кнопку на 1-й вкладке, а не на второй.Буду признателен, если вы предложите лучший способ справиться с этим.
Вот код:
`ui <- fluidPage(
titlePanel(tags$h3("Happiness")),
tabsetPanel(
tabPanel("Plot", "tab1",
sidebarLayout(
sidebarPanel(
selectInput("factor1", "Choose a value:", choices = c("GDPpc", "Family","Life.Expectancy","Freedom", "Generosity", "Trust"), selected = "Family"),
sliderInput(inputId = "happiness1", label = "Choose level of happiness",
min = 0, max = 8, value = 7, step = 0.1),
actionButton("button1", "Update")
),
mainPanel(
# tags$img(height = , width = )
plotlyOutput("plot1")
)
)
),
tabPanel("Table", "tab2",
sidebarLayout(
sidebarPanel(
selectInput("factor2", "Choose a value:", choices = c("GDPpc", "Family","Life.Expectancy",
"Freedom", "Generosity", "Trust"), selected = "Family"),
sliderInput(inputId = "happiness2", label = "Choose level of happiness",
min = 0, max = 8, value = 7, step = 0.1),
actionButton("button2", "Update")
),
mainPanel(
tableOutput("table1")
)
)
)
)
)`
Итак, вы видите, мой интерфейс довольно тяжел для такого простого приложения ..
`server <- function(input, output) {
inputFactor1 <- eventReactive(input$button1, {
inputFactor1 <- input$factor1
})
inputHappiness1 <- eventReactive(input$button1, {
inputHappiness1 <- input$happiness1
})
df1 <- reactive({
report %>%
filter(Happiness.Score >= inputHappiness1()) %>%
dplyr:: select( "Country", "Continent", "Happiness.Score", inputFactor1(), "GDPpc")
})
observe({
output$plot1 <- renderPlotly({
p <- ggplot(df1(), aes(x = df1()[,4], y = Happiness.Score))
p <- p + geom_point(size = 2, aes(text = paste("Country:", df1()[,1]), color = Continent, alpha = 0.85)) +
labs(title = "How happy is the country?", x = names(df1())[4], y = "Happiness Score") +
theme_light(base_size = 12) + ylim(2,8)
ggplotly(p, tooltip = c("text", "y"))
})
})
inputFactor2 <- eventReactive(input$button2, {
inputFactor2 <- input$factor2
})
inputHappiness2 <- eventReactive(input$button2, {
inputHappiness2 <- input$happiness2
})
df2 <- reactive({
report %>%
filter(Happiness.Score >= inputHappiness2()) %>%
dplyr:: select( "Country", "Continent", "Happiness.Score", inputFactor2(), "GDPpc")
})
output$table1 <- renderTable({
head(df2())
})
}
shinyApp(ui = ui, server = server)`
Вот ссылка на приложение