Как проверить, является ли экземпляр reactiveValues пустым или имеет значение R Shiny

#r #ggplot2 #shiny

#r #ggplot2 #блестящий

Вопрос:

Я пытаюсь создать разные ggplots из пользовательского ввода, в зависимости от того, хочет ли пользователь, чтобы фасеты и / или переменная были окрашены. Однако мне нужно проверить, является ли пользовательский ввод varSelectInput пустым или нет, чтобы сделать это. Мой код приведен ниже, начиная с получения пользовательского ввода, затем получения индексов столбцов для передачи в ggplot2 и, наконец, проверки того, какой из четырех входных данных (ось x, ось y, столбец фасетов и столбец цветов) пользователь хочет использовать. Пользователю необходимо нажать кнопку «Построить», чтобы построить график.

     output$descrxaxis_Variable <- renderUI({
      varSelectInput(inputId = "descrxaxis", label = "Choose x axis variable", data = descrDataMelted_selVars$df)})
    
    output$descryaxis_Variable <- renderUI({
      varSelectInput(inputId = "descryaxis", label = "Choose y axis variable", data = descrDataMelted_selVars$df,
                     multiple = TRUE, selectize = TRUE)})
    
    output$descrFacet_Variable <- renderUI({
      varSelectInput(inputId = "descrfacet", label = "Choose facet variable", data = descrDataMelted_selVars$df,
                     multiple = TRUE, selectize = TRUE)})
    
    output$descrColor_Variable <- renderUI({
      varSelectInput(inputId = "descrcolor", label = "Choose color variable", data = descrDataMelted_selVars$df,
                     multiple = FALSE, selectize = TRUE)})
    
    x_ind <- reactiveValues(val = NULL)
    observeEvent(input$descrxaxis, {
      x_ind$val <- which(colnames(descrDataMelted_selVars$df) == input$descrxaxis)})
    
    y_ind <- reactiveValues(val = NULL)
    observeEvent(input$descryaxis, {
      y_ind$val <- which(colnames(descrDataMelted_selVars$df) == input$descryaxis)})
    
    facet_ind <- reactiveValues(val = NULL)
    observeEvent(input$descrfacet, {
      facet_ind$val <- which(colnames(descrDataMelted_selVars$df) == input$descrfacet)})

    color_ind <- reactiveValues(val = NULL)
    observeEvent(input$descrcolor, {
      color_ind$val <- which(colnames(descrDataMelted_selVars$df) == input$descrcolor)})
    
    observeEvent(input$descrBtnPlot,{
      if (!is.null(x_ind) amp; !is.null(y_ind) amp; is.null(facet_ind) amp; is.null(color_ind)){
        req(x_ind$val)
        req(y_ind$val)
        p <- ggplot(descrDataMelted_selVars$df, aes_string(x = colnames(descrDataMelted_selVars$df)[x_ind$val], y = colnames(descrDataMelted_selVars$df)[y_ind$val]))   geom_point()}
      
      if (!is.null(x_ind) amp; !is.null(y_ind) amp; is.null(facet_ind) amp; !is.null(color_ind)){
        req(x_ind$val)
        req(y_ind$val)
        p <- ggplot(descrDataMelted_selVars$df, aes_string(x = colnames(descrDataMelted_selVars$df)[x_ind$val], y = colnames(descrDataMelted_selVars$df)[y_ind$val],
                                                           color = colnames(descrDataMelted_selVars$df)[color_ind$val]))   geom_point()}
      
      if (!is.null(x_ind) amp; !is.null(y_ind) amp; !is.null(facet_ind) amp; is.null(color_ind)){
        req(x_ind$val)
        req(y_ind$val)
        p <- ggplot(descrDataMelted_selVars$df, aes_string(x = colnames(descrDataMelted_selVars$df)[x_ind$val], y = colnames(descrDataMelted_selVars$df)[y_ind$val]))   geom_point()  
          facet_wrap(eval(expr(~!!ensym(colnames(descrDataMelted_selVars$df)[facet_ind$val]))))
      
        output$descrSummaryStatsPlot <- renderPlotly(ggplotly(p))}
    })
  

Что мне нужно изменить, чтобы иметь возможность определить, являются ли facet_ind и / или color_ind пустыми? Я перепробовал кучу разных способов, но ничего не сработало. Спасибо.

Комментарии:

1. Пожалуйста, опубликуйте минимально воспроизводимый пример с некоторыми примерами данных.

2. Я заставил его работать с помощью selectInput, но я чувствую, что это хак. Как говорится, «должен быть лучший способ!».

Ответ №1:

Если вы используете RStudio, есть действительно удобный инструмент отладки, который вы можете использовать для Shiny, если вы вызываете browser() .

Если вы просто пытаетесь проверить, какие значения facet_ind и color_ind , затем поместите browser() прямо перед этой строкой кода, а затем запустите свое приложение. Когда вы запускаете свое приложение, вы должны ввести инструмент отладки в RStudio, и вы должны иметь возможность выполнять код построчно, и в RStudio должна быть панель, где вы можете увидеть, какие значения ваших переменных находятся после каждой строки кода.

Смотрите здесь для получения более подробной информации: https://support.rstudio.com/hc/en-us/articles/205612627-Debugging-with-RStudio