Реактивный текстовый вывод RShiny — Как отобразить вывод SQL-запроса в тексте

#r #sqlite #shiny

#r #sqlite #блестящий

Вопрос:

У меня возникли проблемы с выяснением, как отобразить дату, на которую были обновлены данные. Я создаю приложение, которое отображает таблицы на разных вкладках пользовательского интерфейса, и под каждой таблицей я хотел бы поместить какой-то текстовый вывод, например:

«Значение на дату»

Значение даты присутствует в таблице SQL, в той же базе данных, в которой я открываю и закрываю соединение для создания таблиц. Когда я использую renderText и textOutput для отображения только даты в таблице, я получаю эту ошибку: «Предупреждение: ошибка в cat: аргумент 1 (тип ‘list’) не может быть обработан ‘cat'»

Это код для моего пользовательского интерфейса:

 ui <- fluidPage(theme = shinytheme("cerulean"),
                navbarPage(
                  title = "Application Title",
                  theme = "cerulean",
                  tabPanel("Inputs and Most Important Table",
                  sidebarLayout(
                  sidebarPanel(
                  checkboxGroupInput(inputId = "Study",
                                       label = "Study Type:",
                                       choices = c("MVP", "CSP572"),
                                       selected = c("MVP", "CSP572")),
                 checkboxGroupInput(inputId = "Assay",
                                    label = "Assay Type:",
                                    choices = c("MVP1" = "snp","Methylation" = "meth","WGS" = "wgs","WES" = "wes"),
                                    selected = c("snp","meth","wgs","wes")), #Assay
                 checkboxGroupInput(inputId = "Vendor",
                                    label = "Vendor:",
                                    choices = c("akesogen","bioprocess", "personalis", "claritas"),
                                    selected = c("akesogen","bioprocess", "personalis", "claritas")), #Vendor
                 dateRangeInput(inputId = "Date", label = "Sample Date Range:", format ="yyyy-mm-dd"),  #Date
                 numericInput(inputId = "Sample_Number", label = "Sample Number:", value = NULL),
                 actionButton("read", "Read From Database")
                 ), # Closing the sidebar Panel
                 mainPanel(
                   h4("Sample Information Grouped by Assay and Vendor:"),
                tableOutput("Samples_Grouped_By_Vendor_Assay"), #Samples Grouped By Study
                *textOutput("Database_Refresh_Date")*
                ) # Closing the Main Panel
                  ) # Closing the Side Bar Layout
                  ), # Closing the 1st Tab Panel
                tabPanel("Samples by Study",
                         tableOutput("Samples_Grouped_By_Study"),
                         tableOutput("Samples_Information")
                         #Samples Grouped By Vendor and Assay
                         ), # Closing the 2nd Panel
                tabPanel("Specific Sample Information",
                         tableOutput("Specific_Sample_Information")
                         )# Closing the 4th panel
                ) # closing the navbarPage
                ) #closing fluidPage UI
 

Это код для моего сервера:

 server <- function(input, output){

  #Storing values in myData variable
  myData <- reactiveValues()
  
  observeEvent(
    input$read,
    {
      myData$assay <- input$Assay
      myData$vendor <- input$Vendor
      myData$date_val <- input$Date
      myData$studytype <- input$Study
      myData$samplenumber <- if(!is.null(input$Sample_Number))
      req(input$Assay)
      req(input$Vendor)
      req(input$Study)
  
  
    #Opening database connection
    connectiontodb <- dbConnect(RSQLite::SQLite(), "example.db")

    #Use interpolation to protect against SQL injection
    
    ### First Query of All Samples
    
    myData$interpolatequery1 <- sqlInterpolate(connectiontodb,"
      SELECT study, count(distinct genisis_id), count(distinct vacid)
           FROM genvac
           WHERE study IN (?studytype1, ?studytype2)
            GROUP BY study                                  
                                               ",
                                               studytype1 = myData$studytype[1], studytype2 = myData$studytype[2] 
    )
    myData$exampledataSQLQuery1 <- dbGetQuery(connectiontodb, myData$interpolatequery1)
    
    ### Second Query of Sampled Grouped by Vendor and Assay
    
    myData$interpolatequery2 <- sqlInterpolate(connectiontodb,"
      SELECT CASE s.assay WHEN 'snp' THEN 'MVP1' WHEN 'meth' THEN 'Methylation' WHEN 'wgs' THEN 'WGS' WHEN 'wes' THEN 'WES' ELSE s.assay END AS AssayName, s.vendor, COUNT(distinct g.genisis_id ), COUNT(distinct g.vacid), COUNT(distinct s.shipping_id)
      FROM genvac g, starlims_manifest s 
      WHERE s.vacid = g.vacid 
      AND s.assay IN (?assay1, ?assay2, ?assay3, ?assay4)
      AND s.vendor IN (?vendor1, ?vendor2, ?vendor3, ?vendor4) 
      AND g.study IN (?studytype1, ?studytype2) 
      GROUP BY s.assay , s.vendor", 
                                               assay1 = myData$assay[1], assay2 =myData$assay[2], assay3=myData$assay[3],
                                               assay4=myData$assay[4],
                                               vendor1=myData$vendor[1], vendor2=myData$vendor[2], vendor3=myData$vendor[3], vendor4=myData$vendor[4],
                                               studytype1 = myData$studytype[1], studytype2 = myData$studytype[2] 
    )
    myData$exampledataSQLQuery2 <- dbGetQuery(connectiontodb, myData$interpolatequery2)
    
    ### Third Query: Sample Information
    
    myData$interpolatequery3 <- sqlInterpolate(connectiontodb,"
            SELECT g.study as 'Study', CASE s.assay WHEN 'snp' THEN 'MVP1' WHEN 'meth' THEN 'Methylation' WHEN 'wgs' THEN 'WGS' WHEN 'wes' THEN 'WES' ELSE s.assay END AS AssayName, count(distinct g.genisis_id) as 'Total Shipped', count(distinct c.shippingid) as 'Total Received', count(distinct r.genisis_id) as 'Present in Release 4'
            FROM genvac g left join Rel4Hare r on g.genisis_id=r.genisis_id , starlims_manifest s left join celfile_shippingid c on s.shipping_id=c.shippingid 
            WHERE g.vacid = s.vacid
            AND s.assay IN (?assay1, ?assay2, ?assay3, ?assay4)
            AND g.study IN (?studytype1, ?studytype2)
            GROUP BY s.assay , g.study",
                                               assay1 = myData$assay[1], assay2 =myData$assay[2], assay3=myData$assay[3], assay4=myData$assay[4],
                                               studytype1 = myData$studytype[1], studytype2 = myData$studytype[2]
    )
    myData$exampledataSQLQuery3 <- dbGetQuery(connectiontodb, myData$interpolatequery3)
    
    ### Fourth Query: Information for Specific Sample
    ### TO DO
    #Question: Is there a need for a date input given that there are only date inputs for one study (csp I believe)
    
    #Creating Database Refresh Date Output:

    myData$Data_Refresh_Date <- dbGetQuery(connectiontodb, "SELECT MAX(date_loaded) from genvac")
    
    # Closing connection to database
    dbDisconnect(connectiontodb)
    
    #changing column names of query
    colnames(myData$exampledataSQLQuery1) <- c("Study","Genisis_id", "Specimen")
    colnames(myData$exampledataSQLQuery2) <- c("Assay", "Vendor", "Genisis_id", "Specimen", "Shipping_id")
    }
    )
  *output$Database_Refresh_Date <- renderUI(myData$Data_Refresh_Date)*
  output$Samples_Grouped_By_Study <- renderTable(myData$exampledataSQLQuery1)
  output$Samples_Grouped_By_Vendor_Assay <- renderTable(myData$exampledataSQLQuery2)
  output$Samples_Information <- renderTable(myData$exampledataSQLQuery3)
}
 

Я хочу, чтобы конечный продукт содержал фразу под каждым выводом таблицы, в которой говорится что-то вроде:

«Данные были в последний раз обновлены на: вывод date_database_vector»

Комментарии:

1. Сообщения об ошибках подразумевают, что данные myData$Data_Refresh_Date содержат более одного значения. Проверьте свои данные, чтобы узнать, в каком они формате. Затем вы можете использовать renderUI вместе с некоторыми HTML / paste или renderText или renderPrint для получения желаемого результата.

2. Я понимаю, почему несколько значений могли быть проблемой, но когда я пытаюсь запросить, чтобы было создано только одно значение, я все равно получаю ту же ошибку, что тип аргумента — список? ‘ВЫБЕРИТЕ date_loaded из genvac desc limit 1’

3. Спасибо, мне удалось в какой-то степени разобраться в этом с помощью вашего комментария. Теперь фраза «Данные были обновлены в последний раз: myData $Data_Refresh_Date» выводит желаемый текстовый вывод. Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что текстовый вывод «Данные последнего обновления:» появляется на экране перед выполнением запроса. Я не уверен, как предотвратить это, поскольку мое приложение построено вокруг предпосылки кнопки действия, где все таблицы генерируются после наблюдения за входными данными.

4. Взгляните на shinyjs::hidden