如何通过有光泽的selectInput动态选择数据帧的子集?

时间:2018-04-26 12:49:08

标签: r shiny

我想创建一个简单的闪亮app.In app我上传了一个csv文件。这里使用的csv文件是mtcars.csv。然后有两个selectInputs。我用上传的csv文件的列填充第一个。第二个是由第一个selectInput中已选择的字段的所有值填充的。直到这里一切都很好。当我单击actionButton时,问题就开始了:我想渲染上传的csv的所有记录,其中第一个selectInput等于第二个。例如,如果csv文件是mtcars并且第一个selectInput是柱面而第二个是6,那么我想渲染所有具有6个柱面的汽车。

但是,结果始终为空。以下是我的UI代码:

ui <- fluidPage(

   # Application title
   titlePanel("This is a test!"),


   sidebarLayout(
      sidebarPanel(
         fileInput("file", "Browse",
                   accept = c("text/csv",
                              "text/comma-separated-values,text/plain",
                              ".csv")
                   ),

         selectInput("first","Variable Name", choices = NULL),
         selectInput("second","Ranges", choices = NULL),
         actionButton("btn","Proceed")
      ),


      mainPanel(
         tableOutput("out")
      )
   )
)

这是我的服务器:

server <- function(input, output, session) {

   #storing the csv in df
   df = reactive({
      req(input$file)
      return(read_csv(input$file$datapath))
   })

   #populating first inputSelect
   observe({
      choices1 = colnames(df())
      updateSelectInput(session,"first", choices =  choices1)
   })

   #populating second inputSelect
   observeEvent(input$first,{
      choices1 = df() %>%
         select(input$first) %>%
         unique()

      updateSelectInput(session,"second", choices =  choices1)
   })

   #The goal is to return all rows in df() where the values
   #of column in first selectInput is equal to second selectInput
   observeEvent(input$btn,{
      x = df() %>%
         filter(input$first == input$second) #problem: this is always empty

      output$out = renderTable(x)
   })
}

我是新生的闪亮之作。而且我正在寻找正确的方法来做到这一点。 这是空输出的快照:

enter image description here

1 个答案:

答案 0 :(得分:1)

我相信这应该有用

observeEvent(input$btn,{
      x = df()[df()[,input$first] == input$second,]
      output$out = renderTable(x)
   })

问题是你在做这个

filter("cyl" == 6) 

你需要这样做

filter(cyl == 6)

这种情况正在发生,因为input$first = "cyl"是一个字符串。因此,您的代码将字符串与数字进行比较,该数字在过滤器上给出零行。