Я пишу приложение Shiny, которое несколько раз будет запрашивать базу данных. Запросы могут занять некоторое время, поэтому я использую actionButton
, чтобы пользователь мог контролировать, когда они запускаются.
Общий поток приложения:
- Пользователь загружает страницу, нажимает кнопку для загрузки доступных вариантов из базы данных.
- Пользователь выбирает строку из доступных вариантов, а затем запускает более крупный запрос, который займет больше времени.
- Когда запрос будет выполнен, пользователь получит приятные визуализации и другие подобные вещи.
Я знаю, что вы можете разрешить пользователю выбирать строки из DataTable с помощью параметра selection
, и в настоящее время я использую сборку для разработки, чтобы можно было включить одиночный выбор. Моя проблема заключается в том, чтобы выяснить, как скрыть определенные условные панели, пока пользователь не сделает выбор. Насколько я могу судить, значение выбора хранится в input$[data frame name]_rows_selected
. Но пока значения не выбраны, это значение либо равно NULL, либо не существует.
Я не могу понять, как передать аргументу condition
функции conditionalPanel()
условие, отражающее внутреннюю логику R. Ниже я написал минимальный рабочий пример, который показывает поведение, о котором я говорю.
library(shiny)
library(DT)
# Create sample data
df_sample_data <- data.frame(name = c("John Smith","Jane Cochran","Belle Ralston","Quincy Darcelio"),
color = c("Red","Blue","Red","Green"),
age = c(25,52,31,29))
ui <-
fluidPage(
titlePanel("The Title!"),
sidebarPanel(
h1("Load Data"),
actionButton("load_data","Load Data"),
br(),
conditionalPanel(
h1("Do Thing"),
actionButton("do_thing","Do Thing"),
condition = "input.df_data_rows_selected !== undefined")
),
mainPanel(
dataTableOutput("df_data"),
conditionalPanel(
tableOutput("row_selected"),
condition = "input.df_data_rows_selected !== undefined")
)
)
server <-
function(input, output) {
# This function loads the data (in reality it is a server operation)
uFunc_ReactiveDataLoad <- eventReactive(eventExpr = input$load_data,valueExpr = {
df_data <- df_sample_data
return(list(display_table = datatable(data = df_data[c("name","age")],
options = list(dom = "tip"),
filter = "top",
selection = "single",
colnames = c("Person Name" = "name",
"Person Age" = "age")),
data_table = df_data))
})
output$df_data <- renderDataTable(expr = uFunc_ReactiveDataLoad()$display_table)
output$row_selected <- renderTable(expr = uFunc_ReactiveDataLoad()$data_table[input$df_data_rows_selected,])
}
shinyApp(ui = ui, server = server)
В текущей настройке, использующей input.df_data_rows_selected !== undefined
, панели скрыты до тех пор, пока данные не будут загружены с использованием первого actionButton
. Но мне нужно, чтобы они оставались скрытыми, если пользователь не выбрал строку. Я пробовал другие вещи, такие как:
input.df_data_rows_selected !== null
input.df_data_rows_selected !== 'null'
input.df_data_rows_selected !== ''
input.df_data_rows_selected !== 'NULL'
... и так далее, но мне не повезло. Как значение NULL в R представляется в JavaScript, используемом для аргумента condition
для conditionalPanel()
?