|
a |
|
b/RadETL/R/shiny.R |
|
|
1 |
#' 'RCDMShinyViewer' |
|
|
2 |
#' |
|
|
3 |
#' RCDMShinyViewer function visualizes result of database analysis |
|
|
4 |
#' |
|
|
5 |
#' |
|
|
6 |
#' @param Radiology_Occurrence_Table is a result of R-CDM : Radiology_Occurrence_Table<-radiologyOccurrenceTable(DICOMList) |
|
|
7 |
#' @param Radiology_Image_Table is a result of R-CDM : Radiology_Image_Table<-radiologyImageTable(DICOMList) |
|
|
8 |
#' @import dplyr |
|
|
9 |
#' @import shiny |
|
|
10 |
#' @import ggplot2 |
|
|
11 |
#' @import DT |
|
|
12 |
#' @importFrom magrittr "%>%" |
|
|
13 |
#' |
|
|
14 |
#' |
|
|
15 |
#' @return result of database analysis |
|
|
16 |
#' @examples |
|
|
17 |
#' Radiology_Occurrence_Table<-radiologyOccurrenceTable(DICOMList) |
|
|
18 |
#' Radiology_Image_Table<-radiologyImageTable(DICOMList) |
|
|
19 |
#' RCDMShinyViewer(Radiology_Occurrence_Table, Radiology_Image_Table) |
|
|
20 |
#' @export |
|
|
21 |
RCDMShinyViewer<-function(Radiology_Occurrence_Table, Radiology_Image_Table){ |
|
|
22 |
ui <- fluidPage( |
|
|
23 |
titlePanel('Radiology-CDM'), |
|
|
24 |
sidebarLayout( |
|
|
25 |
sidebarPanel( |
|
|
26 |
helpText('You can see reactive result of your database analysis by selecting Occurrence date, and modality'), |
|
|
27 |
sliderInput(inputId = "dateTime", |
|
|
28 |
"Occurrence date", |
|
|
29 |
min = min(as.Date(Radiology_Occurrence_Table$studyDateTime)), |
|
|
30 |
max = max(as.Date(Radiology_Occurrence_Table$studyDateTime)+1), |
|
|
31 |
value = c(as.Date('2000-01-01'), as.Date('2015-01-01'))), |
|
|
32 |
selectInput('mod', 'modality', choices = unique(Radiology_Occurrence_Table$modality), multiple = T), |
|
|
33 |
helpText('After you select the occurrence date, and modality, you have to select protocol concept ID, and phase additionally. After that extract list of DICOM images files corresponding to the selected conditions by clicking extract button.'), |
|
|
34 |
selectInput('Pro', 'select Radiology Protocol Concept ID', choices = unique(Radiology_Occurrence_Table$radiologyProtocolConceptId), multiple = T), |
|
|
35 |
selectInput('Pha', 'select Radiology Phase Concept ID', choices = unique(Radiology_Image_Table$radiologyPhaseConceptId), multiple = T), |
|
|
36 |
downloadButton('downloadData', 'Extract'), |
|
|
37 |
|
|
|
38 |
width=3), |
|
|
39 |
mainPanel( |
|
|
40 |
fluidRow( |
|
|
41 |
h2('Database Analysis'), |
|
|
42 |
column(6, |
|
|
43 |
h4('Count of occurrences'), |
|
|
44 |
plotOutput(outputId = "modalityCount")), |
|
|
45 |
column(6, |
|
|
46 |
h4('Count of images'), |
|
|
47 |
plotOutput(outputId = "imageCount")), |
|
|
48 |
|
|
|
49 |
h2('Find images you want!'), |
|
|
50 |
column(12, |
|
|
51 |
h4('OMOP concept IDs in your database'), |
|
|
52 |
DTOutput(outputId = "protocolConceptId"), |
|
|
53 |
h3(textOutput('txt'))) |
|
|
54 |
), |
|
|
55 |
width=9) |
|
|
56 |
) |
|
|
57 |
) |
|
|
58 |
|
|
|
59 |
server <- function(input, output){ |
|
|
60 |
output$modalityCount <- renderPlot({ |
|
|
61 |
modality1<-Radiology_Occurrence_Table %>% select(modality) |
|
|
62 |
barplot(table(factor(modality1$modality, levels=unique(Radiology_Occurrence_Table$modality))), border="#69b3a2", col="white", ylim=c(0, max(table(modality1)))) |
|
|
63 |
par(new=TRUE) |
|
|
64 |
modality2<-Radiology_Occurrence_Table %>% filter(as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime)) %>% select(modality) |
|
|
65 |
barplot(table(factor(modality2$modality, levels=unique(Radiology_Occurrence_Table$modality))), col=rgb(0.2,0.4,0.6,0.6), border="#69b3a2", ylim=c(0, max(table(modality1)))) |
|
|
66 |
par(new=TRUE) |
|
|
67 |
modality3<-Radiology_Occurrence_Table %>% filter(as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime) & modality %in% c(input$mod)) %>% select(modality) |
|
|
68 |
barplot(table(factor(modality3$modality, levels=unique(Radiology_Occurrence_Table$modality))), col=7, border="#69b3a2", ylim=c(0, max(table(modality1)))) |
|
|
69 |
par(new=TRUE) |
|
|
70 |
}) |
|
|
71 |
output$imageCount <- renderPlot({ |
|
|
72 |
image1<-Radiology_Occurrence_Table %>% select(modality) |
|
|
73 |
image2<-Radiology_Occurrence_Table %>% select(imageTotalCount) |
|
|
74 |
barplot(table(factor(rep(image1$modality, image2$imageTotalCount), levels=unique(Radiology_Occurrence_Table$modality))), border="#69b3a2", col="white", ylim=c(0, max(table(rep(image1$modality, image2$imageTotalCount))))) |
|
|
75 |
par(new=TRUE) |
|
|
76 |
image3<-Radiology_Occurrence_Table %>% filter(as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime)) %>% select(modality) |
|
|
77 |
image4<-Radiology_Occurrence_Table %>% filter(as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime)) %>% select(imageTotalCount) |
|
|
78 |
barplot(table(factor(rep(image3$modality, image4$imageTotalCount), levels=unique(Radiology_Occurrence_Table$modality))), col=rgb(0.2,0.4,0.6,0.6), border="#69b3a2", ylim=c(0, max(table(rep(image1$modality, image2$imageTotalCount))))) |
|
|
79 |
par(new=TRUE) |
|
|
80 |
image5<-Radiology_Occurrence_Table %>% filter(as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime) & modality %in% c(input$mod)) %>% select(modality) |
|
|
81 |
image6<-Radiology_Occurrence_Table %>% filter(as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime) & modality %in% c(input$mod)) %>% select(imageTotalCount) |
|
|
82 |
barplot(table(factor(rep(image5$modality, image6$imageTotalCount), levels=unique(Radiology_Occurrence_Table$modality))), col=7, border="#69b3a2", ylim=c(0, max(table(rep(image1$modality, image2$imageTotalCount))))) |
|
|
83 |
}) |
|
|
84 |
|
|
|
85 |
output$protocolConceptId <-renderDT({ |
|
|
86 |
RadiologyPlaybook<-unique(LoincRsnaRadiologyPlaybook[,c(2,3)]) |
|
|
87 |
RadiologyPlaybook<-data.frame(RadiologyPlaybook, row.names = NULL) |
|
|
88 |
if(is.null(input$mod)==T){ |
|
|
89 |
dataframe1<-RadiologyPlaybook %>% filter(radiologyProtocolConceptId %in% Radiology_Occurrence_Table$radiologyProtocolConceptId) |
|
|
90 |
dataframe5<-Radiology_Occurrence_Table %>% filter(radiologyProtocolConceptId %in% RadiologyPlaybook$radiologyProtocolConceptId & as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime)) %>% select(radiologyProtocolConceptId, imageTotalCount, radiologyOccurrenceId) |
|
|
91 |
dataframe2<-split(dataframe5, as.character(dataframe5$radiologyProtocolConceptId)) |
|
|
92 |
dataframe2<-lapply(dataframe2, function(x){ |
|
|
93 |
return(data.frame(radiologyProtocolConceptId=unique(x$radiologyProtocolConceptId), Count_of_occurrences=nrow(x), Count_of_images=sum(x$imageTotalCount)))} |
|
|
94 |
) |
|
|
95 |
dataframe2<-do.call(rbind, dataframe2) |
|
|
96 |
dataframe2<-data.frame(dataframe2, row.names = NULL) |
|
|
97 |
answerDF<-merge(dataframe1, dataframe2, by='radiologyProtocolConceptId') |
|
|
98 |
|
|
|
99 |
dataframe4<-Radiology_Occurrence_Table %>% filter(radiologyOccurrenceId %in% as.character(dataframe5$radiologyOccurrenceId)) %>% select(radiologyOccurrenceId, radiologyProtocolConceptId) |
|
|
100 |
dataframe3<-Radiology_Image_Table %>% filter(radiologyOccurrenceId %in% as.character(dataframe4$radiologyOccurrenceId)) %>% select(radiologyOccurrenceId, radiologyPhaseConceptId) %>% group_by(radiologyOccurrenceId, radiologyPhaseConceptId) %>% count() |
|
|
101 |
answer<-merge(dataframe4, dataframe3, by='radiologyOccurrenceId') |
|
|
102 |
answer<-split(answer, as.character(answer$radiologyProtocolConceptId)) |
|
|
103 |
answer<-lapply(answer, function(x){ |
|
|
104 |
answer<-split(x, as.character(x$radiologyPhaseConceptId)) |
|
|
105 |
answer<-sapply(answer, function(y){ |
|
|
106 |
sum(y$n) |
|
|
107 |
}) |
|
|
108 |
ImageCount<-c() |
|
|
109 |
for (i in 1:length(answer)){ |
|
|
110 |
ImageCount<-c(ImageCount, sprintf('%s : %d', names(answer)[i], answer[i])) |
|
|
111 |
} |
|
|
112 |
ImageCount<-paste(ImageCount, collapse = ' / ') |
|
|
113 |
return(data.frame(radiologyProtocolConceptId=unique(x$radiologyProtocolConceptId), counts=ImageCount)) |
|
|
114 |
}) |
|
|
115 |
answer<-do.call(rbind, answer) |
|
|
116 |
answer<-merge(answerDF, answer, by='radiologyProtocolConceptId') |
|
|
117 |
my_vals = answer$radiologyProtocolConceptId |
|
|
118 |
my_colors = ifelse(my_vals %in% input$Pro,'orange','white') |
|
|
119 |
datatable(answer) %>% formatStyle( |
|
|
120 |
'radiologyProtocolConceptId', |
|
|
121 |
target = 'row', |
|
|
122 |
backgroundColor = styleEqual(my_vals, my_colors)) |
|
|
123 |
} else if (is.null(input$mod)==F) { |
|
|
124 |
mods<-paste(input$mod, collapse ='|') |
|
|
125 |
dataframe1<-RadiologyPlaybook %>% filter(radiologyProtocolConceptId %in% Radiology_Occurrence_Table$radiologyProtocolConceptId & grepl(mods, LongCommonName)==T) |
|
|
126 |
dataframe5<-Radiology_Occurrence_Table %>% filter(radiologyProtocolConceptId %in% RadiologyPlaybook$radiologyProtocolConceptId & as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime)) %>% select(radiologyProtocolConceptId, imageTotalCount, radiologyOccurrenceId) |
|
|
127 |
dataframe2<-split(dataframe5, as.character(dataframe5$radiologyProtocolConceptId)) |
|
|
128 |
dataframe2<-lapply(dataframe2, function(x){ |
|
|
129 |
return(data.frame(radiologyProtocolConceptId=unique(x$radiologyProtocolConceptId), Count_of_occurrences=nrow(x), Count_of_images=sum(x$imageTotalCount)))} |
|
|
130 |
) |
|
|
131 |
dataframe2<-do.call(rbind, dataframe2) |
|
|
132 |
dataframe2<-data.frame(dataframe2, row.names = NULL) |
|
|
133 |
answerDF<-merge(dataframe1, dataframe2, by='radiologyProtocolConceptId') |
|
|
134 |
|
|
|
135 |
dataframe4<-Radiology_Occurrence_Table %>% filter(radiologyOccurrenceId %in% as.character(dataframe5$radiologyOccurrenceId)) %>% select(radiologyOccurrenceId, radiologyProtocolConceptId) |
|
|
136 |
dataframe3<-Radiology_Image_Table %>% filter(radiologyOccurrenceId %in% as.character(dataframe4$radiologyOccurrenceId)) %>% select(radiologyOccurrenceId, radiologyPhaseConceptId) %>% group_by(radiologyOccurrenceId, radiologyPhaseConceptId) %>% count() |
|
|
137 |
answer<-merge(dataframe4, dataframe3, by='radiologyOccurrenceId') |
|
|
138 |
answer<-split(answer, as.character(answer$radiologyProtocolConceptId)) |
|
|
139 |
answer<-lapply(answer, function(x){ |
|
|
140 |
answer<-split(x, as.character(x$radiologyPhaseConceptId)) |
|
|
141 |
answer<-sapply(answer, function(y){ |
|
|
142 |
sum(y$n) |
|
|
143 |
}) |
|
|
144 |
ImageCount<-c() |
|
|
145 |
for (i in 1:length(answer)){ |
|
|
146 |
ImageCount<-c(ImageCount, sprintf('%s : %d', names(answer)[i], answer[i])) |
|
|
147 |
} |
|
|
148 |
ImageCount<-paste(ImageCount, collapse = ' / ') |
|
|
149 |
return(data.frame(radiologyProtocolConceptId=unique(x$radiologyProtocolConceptId), Count_of_Images_of_each_Phase=ImageCount)) |
|
|
150 |
}) |
|
|
151 |
answer<-do.call(rbind, answer) |
|
|
152 |
answer<-merge(answerDF, answer, by='radiologyProtocolConceptId') |
|
|
153 |
my_vals = answer$radiologyProtocolConceptId |
|
|
154 |
my_colors = ifelse(my_vals %in% input$Pro,'orange','white') |
|
|
155 |
datatable(answer) %>% formatStyle( |
|
|
156 |
'radiologyProtocolConceptId', |
|
|
157 |
target = 'row', |
|
|
158 |
backgroundColor = styleEqual(my_vals, my_colors) |
|
|
159 |
|
|
|
160 |
|
|
|
161 |
) |
|
|
162 |
} |
|
|
163 |
}) |
|
|
164 |
output$txt <-renderText({ |
|
|
165 |
RadiologyPlaybook<-unique(LoincRsnaRadiologyPlaybook[,c(2,3)]) |
|
|
166 |
RadiologyPlaybook<-data.frame(RadiologyPlaybook, row.names = NULL) |
|
|
167 |
answer1<-Radiology_Image_Table[, c('radiologyOccurrenceId', 'radiologyPhaseConceptId', 'dicomPath')] |
|
|
168 |
answer1<-answer1 %>% filter(radiologyOccurrenceId %in% Radiology_Occurrence_Table$radiologyOccurrenceId) |
|
|
169 |
answer2<-RadiologyPlaybook %>% filter(radiologyProtocolConceptId %in% Radiology_Occurrence_Table$radiologyProtocolConceptId) |
|
|
170 |
answer2<-merge(Radiology_Occurrence_Table[, c('radiologyOccurrenceId', 'studyDateTime', 'modality', 'radiologyProtocolConceptId')], answer2, by='radiologyProtocolConceptId') |
|
|
171 |
answer<-merge(answer1, answer2, by='radiologyOccurrenceId') |
|
|
172 |
answer<-answer %>% filter(as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime) & grepl(paste(input$mod, collapse ='|'), LongCommonName)==T & radiologyProtocolConceptId %in% input$Pro & radiologyPhaseConceptId %in% input$Pha) |
|
|
173 |
Counts<-nrow(answer) |
|
|
174 |
sprintf("You have selected %d images! Now extract list of DICOM files by clicking Export button.", Counts) |
|
|
175 |
}) |
|
|
176 |
output$downloadData <- downloadHandler( |
|
|
177 |
filename = function() { |
|
|
178 |
paste('List_of_DICOM_files.csv') |
|
|
179 |
}, |
|
|
180 |
content = function(file) { |
|
|
181 |
RadiologyPlaybook<-unique(LoincRsnaRadiologyPlaybook[,c(2,3)]) |
|
|
182 |
RadiologyPlaybook<-data.frame(RadiologyPlaybook, row.names = NULL) |
|
|
183 |
answer1<-Radiology_Image_Table[, c('radiologyOccurrenceId', 'radiologyPhaseConceptId', 'dicomPath')] |
|
|
184 |
answer1<-answer1 %>% filter(radiologyOccurrenceId %in% Radiology_Occurrence_Table$radiologyOccurrenceId) |
|
|
185 |
answer2<-RadiologyPlaybook %>% filter(radiologyProtocolConceptId %in% Radiology_Occurrence_Table$radiologyProtocolConceptId) |
|
|
186 |
answer2<-merge(Radiology_Occurrence_Table[, c('radiologyOccurrenceId', 'studyDateTime', 'modality', 'radiologyProtocolConceptId')], answer2, by='radiologyProtocolConceptId') |
|
|
187 |
answer<-merge(answer1, answer2, by='radiologyOccurrenceId') |
|
|
188 |
answer<-answer %>% filter(as.Date(studyDateTime) >= min(input$dateTime) & as.Date(studyDateTime) <= max(input$dateTime) & grepl(paste(input$mod, collapse ='|'), LongCommonName)==T & radiologyProtocolConceptId %in% input$Pro & radiologyPhaseConceptId %in% input$Pha) |
|
|
189 |
write.csv(data.frame(answer$dicomPath, row.names = NULL), file) |
|
|
190 |
}) |
|
|
191 |
} |
|
|
192 |
|
|
|
193 |
shinyApp(ui=ui,server=server) |
|
|
194 |
} |
|
|
195 |
|