| 
									
										
										
										
											2021-10-20 15:34:52 +02:00
										 |  |  | # Construct UI for the methods editor. | 
					
						
							| 
									
										
										
										
											2021-10-19 16:44:29 +02:00
										 |  |  | methods_ui <- function(id) { | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |   verticalLayout( | 
					
						
							|  |  |  |     h3("Methods"), | 
					
						
							|  |  |  |     selectInput( | 
					
						
							|  |  |  |       NS(id, "optimization_genes"), | 
					
						
							|  |  |  |       "Genes to optimize for", | 
					
						
							|  |  |  |       choices = list( | 
					
						
							|  |  |  |         "Reference genes" = "reference", | 
					
						
							|  |  |  |         "Comparison genes" = "comparison" | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ), | 
					
						
							|  |  |  |     selectInput( | 
					
						
							|  |  |  |       NS(id, "optimization_target"), | 
					
						
							|  |  |  |       "Optimization target", | 
					
						
							|  |  |  |       choices = list( | 
					
						
							| 
									
										
										
										
											2022-06-29 18:51:40 +02:00
										 |  |  |         "Number of included genes" = "combined", | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |         "Mean rank" = "mean", | 
					
						
							|  |  |  |         "Median rank" = "median", | 
					
						
							|  |  |  |         "First rank" = "min", | 
					
						
							|  |  |  |         "Last rank" = "max", | 
					
						
							|  |  |  |         "Customize weights" = "custom" | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     ), | 
					
						
							| 
									
										
										
										
											2022-05-26 17:55:40 +02:00
										 |  |  |     lapply(geposan::all_methods(), function(method) { | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |       verticalLayout( | 
					
						
							|  |  |  |         checkboxInput( | 
					
						
							|  |  |  |           NS(id, method$id), | 
					
						
							|  |  |  |           span( | 
					
						
							|  |  |  |             method$description, | 
					
						
							|  |  |  |             class = "control-label" | 
					
						
							|  |  |  |           ), | 
					
						
							|  |  |  |           value = TRUE | 
					
						
							| 
									
										
										
										
											2022-01-25 13:05:04 +01:00
										 |  |  |         ), | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |         sliderInput( | 
					
						
							|  |  |  |           NS(id, sprintf("%s_weight", method$id)), | 
					
						
							|  |  |  |           NULL, | 
					
						
							|  |  |  |           min = -1.0, | 
					
						
							|  |  |  |           max = 1.0, | 
					
						
							|  |  |  |           step = 0.01, | 
					
						
							|  |  |  |           value = 1.0 | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   ) | 
					
						
							| 
									
										
										
										
											2021-10-19 16:44:29 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 15:34:52 +02:00
										 |  |  | # Construct server for the methods editor. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @param analysis The reactive containing the results to be weighted. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @return A reactive containing the weighted results. | 
					
						
							| 
									
										
										
										
											2022-01-25 13:05:04 +01:00
										 |  |  | methods_server <- function(id, analysis, comparison_gene_ids) { | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |   moduleServer(id, function(input, output, session) { | 
					
						
							|  |  |  |     # Observe each method's enable button and synchronise the slider state. | 
					
						
							| 
									
										
										
										
											2022-05-26 17:55:40 +02:00
										 |  |  |     lapply(geposan::all_methods(), function(method) { | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |       observeEvent(input[[method$id]], { | 
					
						
							|  |  |  |         shinyjs::toggleState( | 
					
						
							|  |  |  |           sprintf("%s_weight", method$id), | 
					
						
							|  |  |  |           condition = input[[method$id]] | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2021-12-17 13:14:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |       shinyjs::onclick(sprintf("%s_weight", method$id), { | 
					
						
							|  |  |  |         updateSelectInput( | 
					
						
							|  |  |  |           session, | 
					
						
							|  |  |  |           "optimization_target", | 
					
						
							|  |  |  |           selected = "custom" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2021-10-19 16:44:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |     # This reactive will always contain the currently selected optimization | 
					
						
							|  |  |  |     # gene IDs in a normalized form. | 
					
						
							|  |  |  |     optimization_gene_ids <- reactive({ | 
					
						
							|  |  |  |       gene_ids <- if (input$optimization_genes == "comparison") { | 
					
						
							|  |  |  |         comparison_gene_ids() | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         analysis()$preset$reference_gene_ids | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-01-25 13:05:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |       sort(unique(gene_ids)) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2022-02-24 15:04:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |     # This reactive will always contain the optimal weights according to | 
					
						
							|  |  |  |     # the selected parameters. | 
					
						
							|  |  |  |     optimal_weights <- reactive({ | 
					
						
							|  |  |  |       withProgress(message = "Optimizing weights", { | 
					
						
							|  |  |  |         setProgress(0.2) | 
					
						
							| 
									
										
										
										
											2022-02-24 15:04:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |         included_methods <- NULL | 
					
						
							| 
									
										
										
										
											2022-02-24 15:04:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 17:55:40 +02:00
										 |  |  |         for (method in geposan::all_methods()) { | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |           if (input[[method$id]]) { | 
					
						
							|  |  |  |             included_methods <- c(included_methods, method$id) | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-12-16 13:52:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |         geposan::optimal_weights( | 
					
						
							|  |  |  |           analysis(), | 
					
						
							|  |  |  |           included_methods, | 
					
						
							|  |  |  |           optimization_gene_ids(), | 
					
						
							|  |  |  |           target = input$optimization_target | 
					
						
							| 
									
										
										
										
											2022-02-24 15:04:04 +01:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |       }) | 
					
						
							|  |  |  |     }) |> bindCache( | 
					
						
							|  |  |  |       analysis(), | 
					
						
							|  |  |  |       optimization_gene_ids(), | 
					
						
							| 
									
										
										
										
											2022-05-26 17:55:40 +02:00
										 |  |  |       sapply(geposan::all_methods(), function(method) input[[method$id]]), | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |       input$optimization_target | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-02-24 15:04:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |     reactive({ | 
					
						
							|  |  |  |       weights <- NULL | 
					
						
							| 
									
										
										
										
											2021-12-16 13:52:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |       if (length(optimization_gene_ids()) < 1 | | 
					
						
							|  |  |  |         input$optimization_target == "custom") { | 
					
						
							| 
									
										
										
										
											2022-05-26 17:55:40 +02:00
										 |  |  |         for (method in geposan::all_methods()) { | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |           if (input[[method$id]]) { | 
					
						
							|  |  |  |             weight <- input[[sprintf("%s_weight", method$id)]] | 
					
						
							|  |  |  |             weights[[method$id]] <- weight | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         weights <- optimal_weights() | 
					
						
							| 
									
										
										
										
											2021-12-16 13:52:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |         for (method_id in names(weights)) { | 
					
						
							|  |  |  |           updateSliderInput( | 
					
						
							|  |  |  |             session, | 
					
						
							|  |  |  |             sprintf("%s_weight", method_id), | 
					
						
							|  |  |  |             value = weights[[method_id]] | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2021-10-19 16:44:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |       geposan::ranking(analysis(), weights) | 
					
						
							| 
									
										
										
										
											2021-10-19 16:44:29 +02:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2022-05-26 12:44:09 +02:00
										 |  |  |   }) | 
					
						
							| 
									
										
										
										
											2021-10-19 16:44:29 +02:00
										 |  |  | } |