geposanui/R/filters.R

114 lines
2.8 KiB
R
Raw Normal View History

2021-11-02 13:41:03 +01:00
# Construct UI for the filter editor.
filters_ui <- function(id) {
2022-08-18 11:09:22 +02:00
div(
class = "well",
2022-08-18 12:21:00 +02:00
style = "margin-top: 24px; margin-bottom: 16px;",
2022-08-18 11:09:22 +02:00
verticalLayout(
2022-08-18 12:21:00 +02:00
h5("Filter criteria"),
div(
style = "margin-top: 8px;",
radioButtons(
NS(id, "method"),
label = NULL,
choices = list(
"Filter percentiles" = "percentile",
"Filter scores" = "score",
"Filter ranks" = "rank",
"No filtering" = "none"
),
inline = TRUE
)
2022-05-26 12:44:09 +02:00
),
2022-08-18 11:09:22 +02:00
tabsetPanel(
id = NS(id, "sliders"),
type = "hidden",
tabPanelBody(
value = "percentile",
sliderInput(
NS(id, "percentile"),
label = NULL,
post = "%",
min = 0,
max = 100,
step = 1,
value = c(95, 100)
)
),
tabPanelBody(
value = "score",
sliderInput(
NS(id, "score"),
label = NULL,
min = 0,
max = 1,
step = 0.01,
value = c(0.9, 1.0)
)
),
tabPanelBody(
value = "rank",
sliderInput(
NS(id, "rank"),
label = NULL,
min = 1,
max = 2000,
step = 10,
value = c(1, 1000)
)
),
tabPanelBody(
value = "none"
2022-05-26 12:44:09 +02:00
)
),
2022-08-18 11:09:22 +02:00
sliderInput(
NS(id, "distance"),
label = "Distance to telomeres",
post = " Mbp",
min = 0,
max = 150,
value = c(0, 150)
2022-05-26 12:44:09 +02:00
)
2021-11-02 13:41:03 +01:00
)
2022-05-26 12:44:09 +02:00
)
2021-11-02 13:41:03 +01:00
}
# Construct server for the filter editor.
#
2021-11-02 14:28:04 +01:00
# @param results The results to be filtered.
2021-11-02 13:41:03 +01:00
#
2021-11-02 14:28:04 +01:00
# @return A reactive containing the filtered results.
filters_server <- function(id, results) {
2022-05-26 12:44:09 +02:00
moduleServer(id, function(input, output, session) {
observeEvent(input$method, {
updateTabsetPanel(session, "sliders", selected = input$method)
})
2021-11-02 13:41:03 +01:00
observeEvent(results(), {
updateSliderInput(session, "rank", max = nrow(results()))
})
2022-05-26 12:44:09 +02:00
reactive({
results <- results()
2021-11-02 13:41:03 +01:00
2022-05-26 12:44:09 +02:00
results_prefiltered <- if (input$method == "percentile") {
n_ranks <- nrow(results)
results[
rank <= (1 - (input$percentile[1] / 100)) * n_ranks &
rank >= (1 - (input$percentile[2] / 100)) * n_ranks
]
2022-05-26 12:44:09 +02:00
} else if (input$method == "score") {
2022-08-18 11:09:22 +02:00
results[score >= input$score[1] & score <= input$score[2]]
2022-05-26 12:44:09 +02:00
} else if (input$method == "rank") {
2022-08-18 11:09:22 +02:00
results[rank >= input$rank[1] & rank <= input$rank[2]]
2022-05-26 12:44:09 +02:00
} else {
results
}
2022-05-26 12:44:09 +02:00
results_prefiltered[
distance >= 1000000 * input$distance[1] &
distance <= 1000000 * input$distance[2]
]
2021-11-02 13:41:03 +01:00
})
2022-05-26 12:44:09 +02:00
})
2021-11-02 13:41:03 +01:00
}