2016-03-14 107 views
2

我正在寫一個將查詢數據庫幾次的Shiny應用程序。查詢可能需要一些時間,所以我使用actionButton來允許用戶控制它們何時啓動。基於R中NULL值的閃亮的條件面板條件?

應用程序的一般流程是:

  • 用戶加載頁面,按下按鈕,從數據庫中可用的選項來加載。
  • 用戶從可用選項中選擇一行,然後啓動一個更長的查詢。
  • 查詢完成後,用戶將得到很好的可視化和其他類似的東西。

我知道,你可以允許用戶選擇使用selection選項從一個DataTable行,我目前使用的開發建設,使單一的選擇可以啓用。我的問題是搞清楚如何隱藏某些條件面板,直到用戶做出選擇。據我所知,選擇的價值儲存在input$[data frame name]_rows_selected。但是,直到選中這些值,該值爲NULL或不存在。

我無法弄清楚如何傳遞conditionalPanel()參數condition這個條件反映了內部的R邏輯。我在下面寫了一個最小的工作示例,其中顯示了我所指的行爲。

library(shiny) 
library(DT) 

# Create sample data 
df_sample_data <- data.frame(name = c("John Smith","Jane Cochran","Belle Ralston","Quincy Darcelio"), 
          color = c("Red","Blue","Red","Green"), 
          age = c(25,52,31,29)) 

ui <- 
    fluidPage(

     titlePanel("The Title!"), 

     sidebarPanel(

      h1("Load Data"), 
      actionButton("load_data","Load Data"), 
      br(), 
      conditionalPanel(

       h1("Do Thing"), 
       actionButton("do_thing","Do Thing"), 
       condition = "input.df_data_rows_selected !== undefined") 
      ), 

     mainPanel(

      dataTableOutput("df_data"), 
      conditionalPanel(

       tableOutput("row_selected"), 
       condition = "input.df_data_rows_selected !== undefined") 
      ) 
    ) 

server <- 
    function(input, output) { 

     # This function loads the data (in reality it is a server operation) 
     uFunc_ReactiveDataLoad <- eventReactive(eventExpr = input$load_data,valueExpr = { 

      df_data <- df_sample_data 
      return(list(display_table = datatable(data = df_data[c("name","age")], 
                options = list(dom = "tip"), 
                filter = "top", 
                selection = "single", 
                colnames = c("Person Name" = "name", 
                   "Person Age" = "age")), 
         data_table = df_data)) 
     }) 
     output$df_data <- renderDataTable(expr = uFunc_ReactiveDataLoad()$display_table) 
     output$row_selected <- renderTable(expr = uFunc_ReactiveDataLoad()$data_table[input$df_data_rows_selected,]) 
    } 

shinyApp(ui = ui, server = server) 

在當前的設置,其使用input.df_data_rows_selected !== undefined,面板被隱藏,直到數據被使用第一actionButton加載。但是,除非用戶選擇了一行,否則我需要它們保持隱藏狀態。我曾嘗試其他的東西,如:

  • input.df_data_rows_selected !== null
  • input.df_data_rows_selected !== 'null'
  • input.df_data_rows_selected !== ''
  • input.df_data_rows_selected !== 'NULL'

...等等,但我有沒有運氣。 R中的NULL值如何在用於conditionalPanel()condition參數的JavaScript中表示?

回答

4

condition = "(typeof input.df_data_rows_selected !== 'undefined' && input.df_data_rows_selected.length > 0)"這兩個條目似乎工作。

+0

這似乎不適用於我。和以前一樣,一旦按下「加載數據」按鈕,但在選擇一行之前,就會出現「做事」面板。 – TARehman

+0

男人,這是一個艱難的... ...''condition ='input.df_data_rows_selected.length> 0')'得到真的很接近,但不是那裏... – cory

+0

'condition ='input.df_data_rows_selected [0]!= null ')'與上面相同... – cory