Блестящие условия conditionalPanel на основе значений NULL в R?

Я пишу приложение 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()?


person TARehman    schedule 14.03.2016    source источник


Ответы (1)


condition = "(typeof input.df_data_rows_selected !== 'undefined' && input.df_data_rows_selected.length > 0)" для обеих записей работает.

person cory    schedule 14.03.2016
comment
Кажется, это не работает для меня. Как и раньше, панель Do Thing появляется после нажатия кнопки «Загрузить данные», но до выбора строки. - person TARehman; 14.03.2016
comment
Чувак, это сложно... condition = 'input.df_data_rows_selected.length > 0') очень близко, но не совсем... - person cory; 14.03.2016
comment
@TARehman Я понял ... нужно проверить, не определен ли массив, а его длина › 0. Я отредактировал свой ответ - person cory; 15.03.2016
comment
Оно работает! Если вы хотите добавить немного к ответу, объясняющему, почему это работает, это, вероятно, поможет другим неофитам JS, таким как я. - person TARehman; 15.03.2016
comment
Я начал пытаться придумать объяснение, но это было бы просто предположением. Я, вероятно, такой же новичок в javascript, как и вы. Я просто искал информацию о тестировании пустых массивов в javascript, и это было единственное, что я нашел. Я хотел бы сделать лучше, но, честно говоря, для меня это был просто метод проб и ошибок. - person cory; 15.03.2016
comment
Работает на меня! Если когда-нибудь приедешь через Мэдисон, позвони мне, и я куплю тебе пива или еще чего-нибудь. :) - person TARehman; 15.03.2016