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