#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