【问题标题】:Filter data frame in Shiny app在 Shiny 应用程序中过滤数据框
【发布时间】:2018-07-31 03:30:40
【问题描述】:

我正在尝试使用用户输入作为单选按钮来过滤数据框。不幸的是,只有一种类型的过滤器有效(在我的示例中为“年度”版本),但“每月”和“每季度”选项没有返回任何内容。这是我的示例数据集和代码。

    # sample data
mydf <- data.frame("Data"=rnorm(12), 
                   "Months"=c("Jan", "Nov", "Dec", "Feb", 
                              "Mar", "Apr", "May", "Jun", 
                              "Jul", "Aug", "Sep", "Oct"))
library(shiny)
library(dbplyr)
ui <- fluidPage(
        # Input() function
        radioButtons(inputId = "myDateInterval", label = "Select Date Interval",
                     choiceNames = list("Monthly","Quarterly","Annual"),
                     choiceValues = list(unique(as.character(mydf$Month)),
                                         unique(as.character(mydf$Month))
                                      [seq(1,length(unique(mydf$Month)),3)],
                                         unique(as.character(mydf$Month)[1]))),

        # Output() functions
        tableOutput("results"))
# set up server object
server <- function(input, output) {
        output$results <-  renderTable({
                mydf %>% filter(Months %in% input$myDateInterval)
        })
}
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny radio-button dbplyr


    【解决方案1】:

    文档对这个限制不是很清楚,但是在

    https://blog.rstudio.com/2017/04/05/shiny-1-0-1/

    你找到了

    choiceValues 中的元素仍然必须是纯文本(这些是 用于计算的值)。但是choiceNames 中的元素(UI 标签)可以用 HTML 构造出来,或者使用 HTML() 函数或 HTML 标记生成函数,如 tags$img() 和 图标()。

    纯文本是必需的,因为它必须跨越 JS 和 R 之间的边界。您可以使用 JSON 作为传输器;在这里我真的不推荐它,但它相当容易:

    library(jsonlite)
    library(shiny)
    mydf <- data.frame("Data"=rnorm(12), 
                       "Months"=c("Jan", "Nov", "Dec", "Feb", 
                       "Mar", "Apr", "May", "Jun", 
                       "Jul", "Aug", "Sep", "Oct"), stringsAsFactors = FALSE)
    ui <- fluidPage(
      # Input() function
      radioButtons(inputId = "myDateInterval", label = "Select Date Interval",
                   choiceNames = list("Monthly","Quarterly","Annual"),
                   choiceValues = list(toJSON(mydf$Month),
                                       toJSON(mydf$Month[seq(1,length(unique(mydf$Month)),3)]),
                                       toJSON(mydf$Month[1]))),
    
      # Output() functions
      tableOutput("results"))
    # set up server object
    server <- function(input, output) {
      output$results <-  renderTable({
        ipt = fromJSON(input$myDateInterval)
        ret = mydf[mydf$Months %in% ipt,]
        ret
      })
    }
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      【解决方案2】:

      这对你有用吗:

      ui <- fluidPage(
        # Input() function
        radioButtons(inputId = "myDateInterval", label = "Select Date Interval",
                     choiceNames = list("Monthly","Quarterly","Annual"), choiceValues = list("Monthly","Quarterly","Annual")),
      
        # Output() functions
        tableOutput("results"))
      # set up server object
      server <- function(input, output) {
        output$results <-  renderTable({
      
          if(input$myDateInterval == "Monthly") {
      
         mydf2 <- mydf %>% filter(Months %in% (unique(as.character(mydf$Month))))
      
          }
      
          if(input$myDateInterval == "Quarterly") {
      
            mydf2 <- mydf %>% filter(Months %in% (unique(as.character(mydf$Month)))[seq(1,length(unique(mydf$Month)),3)])
      
          }
      
          if(input$myDateInterval == "Annual") {
      
            mydf2 <- mydf %>% filter(Months %in% (unique(as.character(mydf$Month)[1])))
      
          }
      
          mydf2
        })
      }
      shinyApp(ui = ui, server = server)
      

      【讨论】:

      • 谢谢@MLavoie。它确实有效!但如果没有必要,我希望避免使用 if 语句。关于如何做到这一点的任何想法?
      • 我认为不可能。它说:“值应该是字符串”也许其他人会有更好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2019-06-12
      • 2017-08-28
      • 2019-11-08
      • 1970-01-01
      • 2021-09-29
      • 2019-04-29
      • 2018-04-03
      • 1970-01-01
      相关资源
      最近更新 更多