При построении графиков на графиках в приложении Shiny созданные кадры данных доступны только для первого, но не для второго графика («Ошибка: объект df2 не найден»). Копирование и вставка кода для генерации фреймов данных во вторую часть renderPlot решает проблему, но является избыточной и замедляет работу приложения. Есть ли более элегантный способ сделать данные доступными для нескольких частей renderPlot? Я пытался использовать функцию Shinys реактивной (), но безуспешно.
Вот минимальный пример:
library(shiny)
library(ggplot2)
# Define UI for application that draws a histogram
ui <- fluidPage(
titlePanel("Utility"),
sidebarLayout(
sidebarPanel(
sliderInput("var1",
"N",
min = 1,
max = 100,
value = 20)),
mainPanel(
plotOutput("barplot1"),
plotOutput("barplot2"))))
# Define server logic required to draw a barplot
server <- function(input, output) {
output$barplot1 <- renderPlot({
df <- as.data.frame(matrix(c(
"A", "1", rnorm(1, input$var1, 1),
"A", "2", rnorm(1, input$var1, 1),
"B", "1", rnorm(1, input$var1, 1),
"B", "2", rnorm(1, input$var1, 1)),
nrow = 4, ncol=3, byrow = TRUE))
df$V3 <- as.numeric(as.character(df$V3))
df2 <- as.data.frame(matrix(c(
"A", "1", rnorm(1, input$var1, df[1,3]),
"A", "2", rnorm(1, input$var1, df[1,3]),
"B", "1", rnorm(1, input$var1, df[1,3]),
"B", "2", rnorm(1, input$var1, df[1,3])),
nrow = 4, ncol=3, byrow = TRUE))
df2$V3 <- as.numeric(as.character(df$V3))
ggplot(df, aes(x=V1, y=V3, fill=V2)) +
geom_bar(stat="identity")
})
output$barplot2 <- renderPlot({
ggplot(df2, aes(x=V1, y=V3, fill=V2)) +
geom_bar(stat="identity")
})
}
# Run the application
shinyApp(ui = ui, server = server)