r shinyapp: изменить фрейм данных с помощью numericInput

#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)