在Shiny(R)中创建动态过滤器

时间:2017-10-24 21:15:49

标签: r shiny

我正在尝试创建一个闪亮的应用程序,其中多条件过滤器中的代码依赖于用户输入。所以,如果"所有"选中后我们会看到所有内容,如果所选输入等于其他内容,我们只会看到该输入的数据。

if语句将代码插入到dplyr过滤器中。

我希望我能正确解释,如有任何帮助,请参阅以下代码:

服务器

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


shinyServer(function(input, output) {


 raw <- diamonds



  output$cutlist <- renderUI({

  cutlist <- sort(unique(as.vector(raw$cut)), decreasing = FALSE)
  cutlist <- append(cutlist, "All", after =  0)
  selectizeInput("cutchoose", "Cut:", cutlist)

 })


  output$colorlist <- renderUI({

colorlist <- sort(unique(as.vector(raw$color)), decreasing = FALSE)
colorlist <- append(colorlist, "All", 0)
selectizeInput("colorchoose", "color:", colorlist)

})


   output$table <- renderDataTable({



   if(input$colorchoose == "All") {

  filt1 <- quote(color != "@?><")


} else {

  filt1 <- quote(color == input$colorchoose) 

}


if (input$cutchoose == "All") {

  filt2 <- quote(cut != "@?><")


} else {

  filt2 <- quote(cut == input$cutchoose)

}



  raw %>%
  filter_(filt1) %>%
  filter_(filt2)


   })

   })

UI

 shinyUI(fluidPage(

 # Application title
 titlePanel("Dynamic Filter Test App"),


  sidebarLayout(
   sidebarPanel(
   uiOutput("cutlist"),
   uiOutput("colorlist")
   ),


mainPanel(
  dataTableOutput("table")
   )
  )
 ))

控制台

  Warning: Error in if: argument is of length zero
  Stack trace (innermost first):
  79: renderDataTable [D:\Independent Learning\R 
       code\dynamFilter/server.R#44]
  78: func
  77: origRenderFunc
   76: output$table
    1: runApp

2 个答案:

答案 0 :(得分:1)

这对我有用:

output$table <- renderDataTable({

    req(input$colorchoose)
    req(input$cutchoose)
    if(input$colorchoose == "All") {

      filt1 <- quote(color != "@?><")


    } else {

      filt1 <- paste0("color == ","'",input$colorchoose,"'") 

    }


    if (input$cutchoose == "All") {

      filt2 <- quote(cut != "@?><")


    } else {

      filt2 <- paste0("cut == ","'",input$cutchoose,"'")

    }



    raw %>%
      filter_(filt1) %>%
      filter_(filt2)


  })

开头的req语句可以防止对renderDataTable进行全面评估,直到输入正确初始化为止。第二个问题是输入变量似乎不在动态评估过滤器的范围内,因此我将语句更改为包含这些变量的值而不是其他名称。

答案 1 :(得分:0)

我曾经遇到过类似的错误。我认为原因是renderUI表达式未必及时评估,以生成input语句所需的if值。由于renderUI的{​​{1}}表达式中没有任何反应值,您可以将它们放在selectInput()脚本中,并将其从ui中删除脚本。

这对我有用:

server