R中闪亮应用内的tabpanel

时间:2016-07-08 22:37:36

标签: r shiny

我被要求做一个简单的闪亮应用程序。我有以下代码:

library(shiny)

ui <- fluidPage(

  tabsetPanel(
    tabPanel(title = "Central Limit Theorem",
             sliderInput(inputId = "num", label = "Choose a sample size",
                         value = 5, min = 1, max = 50),
              plotOutput(outputId = "hist")
    )
    ,
      tabPanel(title = "BMI prediction",
               pageWithSidebar(
               # Application title
               headerPanel("BMI prediction"),

               sidebarPanel(
                 numericInput('wt', 'Weight in Pounds', 90, min = 50, max = 200),
                 submitButton('Submit'),
                 numericInput('ht', 'Height in Inches', 60, min = 50, max = 85),
                 submitButton('Submit')
                ),
               mainPanel(
                 h3('Results of prediction'),
                 h4('Your weight is'),
                 verbatimTextOutput("inputValue1"),
                 h4('Your height is'),
                 verbatimTextOutput("inputValue2"),
                 h4('Which resulted in a BMI of '),
                 verbatimTextOutput("prediction")

               )
              )

        )

        )
      )  
# Define server logic required to draw a histogram
server <- function(input, output) {
  output$hist <- renderPlot({
    par(mfrow = c(1,2))
    r <- 10000
    samp <- matrix(rexp(n=(input$num)*r, rate = 2), nrow = r)
    sample.means <- apply(samp,1,mean) 
    hist(sample.means,col="purple", main="Sampling Distribution of the Sample Mean", 
         xlab = "Sample Mean")
    qqnorm(sample.means, col = "purple")
  })
   bmi_calc <- function(weight, height) (weight/height^2)*703
   output$inputValue1 <- renderPrint({input$wt})
   output$inputValue2 <- renderPrint({input$ht})
   output$prediction <- renderPrint({bmi_calc(input$wt, input$ht)})
   } 
  shinyApp(ui = ui, server = server)

由于某种原因,第一个选项卡中的直方图不响应滑块。如果我不包含第二个标签,则可以正常使用。

1 个答案:

答案 0 :(得分:1)

这是两个submitButton;如果您单击第二个选项卡上的任一按钮并返回第一个选项卡,它将更新。不幸的是,我认为有一种方法可以指定submitButton更新哪些输入(当前两个输入都适用于所有三个输入,因此第二个选项卡上的两个输入是多余的)。但是,有一些选择:

  • 在每个标签上放置一个submitButton,这将无害(除非一个资源非常紧张)更新所有输入。
  • submitButton放在tabsetPanel之外,以便一个按钮可以更新所有三个输入。
  • 使用actionButton更新您明确喜欢的任何值。这种方法可以让您更精确地控制何时更新,但代价是需要更多的代码工作。如果您的小部件需要大量资源而您不想过度更新,那么这是最佳选择。
  • 摆脱所有按钮,所以一切都瞬间更新。在此示例中,这是我的偏好,因为执行的操作不是资源密集型的,并且可以提供更具响应性的用户体验。