R 检查if语句中是否存在反应性数据帧

R 检查if语句中是否存在反应性数据帧,r,if-statement,shiny,reactive,R,If Statement,Shiny,Reactive,我正在使用R制作一个仪表板,它有一个包含许多图表的概览页面。所有图表都是使用相同的模块创建的。 用户可以选择一个他们希望所有图表显示的主题,但并非所有图表都存在所有主题 因此,通过某些选择,并非所有图表都会显示数据。 在这些情况下,我希望显示一个文本,告诉用户该主题不适用于该特定图表 “我的图表”的输入是一个仅在主题存在时创建的数据框: data_indicator <- reactive({ req(input$choice %in% data$subject) dat

我正在使用R制作一个仪表板,它有一个包含许多图表的概览页面。所有图表都是使用相同的模块创建的。 用户可以选择一个他们希望所有图表显示的主题,但并非所有图表都存在所有主题

因此,通过某些选择,并非所有图表都会显示数据。 在这些情况下,我希望显示一个文本,告诉用户该主题不适用于该特定图表

“我的图表”的输入是一个仅在主题存在时创建的数据框:

  data_indicator <- reactive({
   req(input$choice %in% data$subject)
    data_indicator <- data %>%
      filter(subject ==  input$choice)
  })
我作出了两项产出: 一个用于创建图表,另一个用于显示文本

现在我想检查是否已经创建了数据帧来选择要使用的数据帧。我已尝试使用以下语句执行此操作:

  output$plot_text <- renderUI({
    if (exists("data_indicator()")){
      output <- highchartOutput(ns("plot"))
     } else {
      output <- div(htmlOutput(ns("text")))
    }
    tagList(output)
  })
但是它不起作用,所有的图表现在都显示文本,即使是那些应该可用的


exists命令是否不适用于反应数据集?还是有其他问题?

如果您过滤了太多的数据,例如,如果您过滤了一个不包含的变量,data.frame仍然存在,它只有零行。因此,您需要检查它是否有零行,如果是这种情况,您可能希望显示正确的错误或警告消息

更新:

OP指出,上述情况不适用于他的反应式数据帧,因为他使用req首先停止数据帧的创建

在这种情况下,建议使用validate/need而不是req

由于req导致输出以静默方式停止,因此在 需要告知用户哪些值丢失或丢失的情况 需要采取哪些用户操作才能继续。 那样的话,你需要 更灵活的验证功能,它提供了 通过验证/需要功能的req功能;reqx基本上只是 ValidateNedx的简写,message=FALSE

摘自

下面我提供了一个使用iris数据集的简单示例

我还建议RStudio使用validate和need函数

library("shiny")
library("dplyr")
library("ggplot2")


shinyApp(

    ui = fluidPage(

        # Layout with sidebar
        sidebarLayout(

            ## Sidebar -----
            sidebarPanel(

                # > some example input on sidebar -----

                selectInput("choice", "Choose species",
                            choices = c("none",
                                        unique(as.character(iris$Species))),
                            selected = "setosa")

            ), # closes Sidebar-Panel



            # Main-Panel ------
            mainPanel(
                br(),
                tabsetPanel(

                    # > Plot -------

                    tabPanel("Plot tab",
                             value = 1,

                             plotOutput("plot_text")

                    ), # closes tabPanel

                    id = "tabselected", type = "pills"

                )  # closes tabsetPanel      

            )  # closes mainPanel                      

        ) # closes sidebarLayout

    ), # closes fluidPage


    # Server ------
    server = function(input, output, session){

        data_indicator <- reactive({

            validate(
                need(input$choice %in% iris$Species, "No plot available for chosen filter criteria!")
            )

            iris %>%
                mutate(Species = as.character(Species)) %>%
                filter(Species == input$choice)

        })

        output$plot_text <- renderPlot({


            # Alternativly use validate here in the following way:
            # validate(
            #     need(input$choice %in% data_indicator()$Species, "No plot available for chosen filter criteria!")
            # )

            ggplot(data_indicator(), aes(x = Species, y = Sepal.Length)) +
                geom_col()


        })

    } # Closes server
) # Closes ShinyApp

尝试更改为existsdata_指示符号,但它不起作用。由于我的数据帧是被动的,我想我必须添加。谢谢你详细的回答!在我的例子中,日期框没有零行,由于req,它实际上不存在。打印和文本输出的混合确实有效,我在其他模块中使用了它,效果很好。我不确定验证选项是否有效;我不知道如何为它提供合适的条件,因为existsdata_指示器不工作,这是我的问题;我同意使用validate是解决if语句的更好方法!谢谢你的澄清。我没有考虑到您使用req。在您的情况下,似乎建议使用validate而不是req。请参阅我的最新答案。