首页 > 解决方案 > 尝试在 Shiny 应用程序中使用相关的多选列表作为过滤器

问题描述

我有一个闪亮的应用程序,它为用户提供了各种过滤器,包括地区和国家。国家/地区的选择取决于选择的地区。这很有效,因为当我选择一个地区时,我会看到正确的国家。这适用于服务器部分中的此代码:

observe({
    x <- regions %>%
        filter(country_region %in% input$region) %>%
        select(Country)
    updateSelectInput(session, "country", "Select countries", choices = unique(x))
})

然后稍后我想为地区和国家选择过滤数据框。首先,我只在区域上过滤数据框,因为我希望用户能够选择一个区域并获得所有国家/地区的所有结果(用户必须按一个按钮来更新结果,即input$go):

give_data <- eventReactive(input$go, {
        message(exists("input$country"))
        message(input$country)
        prod_a_domains <- corp_dat %>%
            filter(country_region %in% input$region)

这给了我为该地区过滤的数据,当我没有选择一个国家时,这两条消息是FALSEinput$country不存在)和空白(没有价值)。

接下来,如果有国家选择,我想过滤国家。我尝试这样做:

    if (!exists("input$country")) {
        message("met condition, no country filter")
        prod_a_domains <- prod_a_domains %>%
            select(email_domain) %>%
            distinct()
    } else {
        message("did not meet, filtering")
        prod_a_domains <- filter(prod_a_domains, Country %in% input$country) %>%
            select(email_domain) %>%
            distinct()
    }

我相信这会起作用,问题是即使在我选择国家/地区后exists("input$country")仍然可以解决,但确实告诉我我选择的国家/地区名称。所以 if 逻辑没有正确处理,无论我是否选择了一个国家,它总是遵循第一条路径而不是 ELSE 条件。发生了一些事情,我不明白那个物体在那个时间点的“存在”。FALSEmessage(input$country)

标签: rshiny

解决方案


基本 R 函数exists()检查环境中是否存在对象,如下所示data.frame

> df<- data.frame(a=1:5, b=6:10)
> exists("df")
[1] TRUE

它仅适用于对象,不适用于它们的属性:

> exists("df$a")
[1] FALSE

也不exists()检查它们是否具有值:

> nullvar<- NULL
> exists("nullvar")
[1] TRUE

因此,在您的示例中,您可以检查该对象是否input存在:

exists("input")

但是如果你想检查它的一个属性是否有值,你必须使用!is.null()

!is.null(input$select)

推荐阅读