r - 尝试在 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)
这给了我为该地区过滤的数据,当我没有选择一个国家时,这两条消息是FALSE
(input$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 条件。发生了一些事情,我不明白那个物体在那个时间点的“存在”。FALSE
message(input$country)
解决方案
基本 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)
推荐阅读
- javascript - D3 V5:将初始缩放与缩放事件同步
- python - csv文件数据清洗流程
- javascript - 有没有办法为在刷新或 DOM 位置发生变化时不会获得无效元素的元素生成唯一选择器?
- javascript - #dom-to-image 将屏幕外 div 导出为图像
- c# - WPF ItemTemplate 导致列表框内容大小问题
- c - 我正在尝试下eof和getchar()
- r - mutate 和 rnorm 的 R 行为
- html - 输入类型范围滑块拇指显示修复
- html - CSS 效果阻碍了移动版本的可见性
- python - Django 密码字段不使用引导属性呈现