2017-01-11 109 views
0

在一個Shiny應用程序中,有沒有一種方法可以保留舊的無功輸出並將其顯示在應用程序中以及新的無功輸出?舉個例子:假設我想顯示一個線性模型的彙總表,我逐漸添加更多的變量。我目前有一個checkboxGroupInput面板,我使用該面板選擇要包含在模型中的解釋變量,然後渲染一個包含使用所選變量估計的模型摘要的表格。現在,當我決定使用一組不同的變量時,我想保留顯示的原始摘要表,但還要在舊的摘要表下添加新的摘要表。如果可能的話,我想顯示所有過去的反應表實例,即應用程序中顯示的表格數應該等於我決定在整個應用程序中使用的不同解釋變量集的數量。目前,該表格的ui部分中的htmlOutputstargazer包中的renderText部分和server部分中的renderText呈現。R Shiny:保留舊輸出

+0

你可以追加或r/cbind新表到舊錶,並在表中創建一個額外的變量指示輸出來自哪個模型?理論上,如果生成一個新表,則可以隱藏一堆UI數據表,如果生成新表,則將當前表更改爲其中一個NULL表,以便現在它將顯示出來。但是,當您生成新的表格時,您必須手動對錶格的移動進行編碼,並且只能在手動編寫到UI中時顯示儘可能多的舊結果,因此它不會永遠持續下去。我更喜歡第一個解決方案。 –

回答

1

這是一種有效的方法。它使用一個reactiveValues對象,並且每次單擊「Fit Model」按鈕時,都會將新模型附加到列表的末尾。數字輸入控制在屏幕上顯示的模型數量。這保留了您在會議中適合的每個模型。

我沒有做stargazer表,因爲我不熟悉它。但你應該能夠很容易地適應這一點。

library(shiny) 
library(broom) 

shinyApp(
    ui = 
    shinyUI(
     fluidPage(
     sidebarLayout(
      sidebarPanel(
      checkboxGroupInput(inputId = "indep", 
           label = "Independent Variables", 
           choices = names(mtcars)[-1], 
           selected = NULL), 
      actionButton(inputId = "fit_model", 
         label = "Fit Model"), 
      numericInput(inputId = "model_to_show", 
         label = "Show N most recent models", 
         value = 2) 
     ), 
      mainPanel(
      htmlOutput("model_record") 
     ) 
     ) 
    ) 
    ), 

    server = 
    shinyServer(function(input, output, session){ 
     Model <- reactiveValues(
     Record = list() 
    ) 

     observeEvent(
     input[["fit_model"]], 
     { 
      fit <- 
      lm(mpg ~ ., 
       data = mtcars[c("mpg", input[["indep"]])]) 

      Model$Record <- c(Model$Record, list(fit)) 
     } 
    ) 

     output$model_record <- 
     renderText({ 
      tail(Model$Record, input[["model_to_show"]]) %>% 
      lapply(tidy) %>% 
      lapply(knitr::kable, 
        format = "html") %>% 
      lapply(as.character) %>% 
      unlist() %>% 
      paste0(collapse = "<br/><br/>") 
     }) 

    }) 
) 
+0

這個工作,@Benjamin! – Skumin