#r #shiny #shinyapps
#r #блестящий #shinyapps
Вопрос:
У меня есть следующее блестящее приложение, которое состоит из числового ввода и в качестве выходных данных двух ggplot-графиков.
library(shiny)
n <- 100
dat <- data.frame(var1 = round(rnorm(n, 50, 10),0),
var2 = sample(c("A", "B"), n, replace = TRUE))
# USER INTERFACE
ui <- fluidPage(
titlePanel("My Sample App"),
sidebarLayout(
sidebarPanel(
numericInput("n", "Number of cases", value=100)
),
mainPanel(
plotOutput("boxplot"),
plotOutput("distribution")
)
)
)
# SERVER
server <- function(input, output) {
output$boxplot <- renderPlot({
ggplot(data = dat, aes(x = var2, y = var1)) geom_boxplot() ggtitle("Boxplot")
})
output$distribution <- renderPlot({
ggplot(data = dat, aes(var1)) geom_histogram() ggtitle("Histogram")
})
}
# Run the application
shinyApp(ui = ui, server = server)
Я пытался заменить n = 10
на n = input$n
. Однако это не сработало, и я не уверен, где именно я должен определить data.frame (внутри серверной функции?). Кто-нибудь может помочь, пожалуйста?
Ответ №1:
input$n
это реактивная переменная, которая может использоваться только в реактивном контексте. Вы можете определить реактивный контекст только в server
функции, например, с помощью reactive
. Взгляните сюда для объяснения.
library(shiny)
library(ggplot2)
# USER INTERFACE
ui <- fluidPage(
titlePanel("My Sample App"),
sidebarLayout(
sidebarPanel(
numericInput("n", "Number of cases", value=100)
),
mainPanel(
plotOutput("boxplot"),
plotOutput("distribution")
)
)
)
# SERVER
server <- function(input, output) {
dat <- reactive({
data.frame(var1 = round(rnorm(input$n, 50, 10),0),
var2 = sample(c("A", "B"), input$n, replace = TRUE))
})
output$boxplot <- renderPlot({
ggplot(data = dat(), aes(x = var2, y = var1)) geom_boxplot() ggtitle("Boxplot")
})
output$distribution <- renderPlot({
ggplot(data = dat(), aes(var1)) geom_histogram() ggtitle("Histogram")
})
}
# Run the application
shinyApp(ui = ui, server = server)