r Shinyapp:使用numericInput更改数据框

问题描述

我有以下闪亮的应用程序,它由一个数字输入和两个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(在服务器函数内部?)。有人可以帮忙吗?

解决方法

input$n是一个反应型变量,只能在反应型上下文中使用。您只能在server函数中定义反应式上下文,例如使用reactive。看看here来获得解释。

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)