R Shiny过滤器有两个输入

时间:2017-10-24 17:40:16

标签: r input shiny

您好我需要帮助通过输入过滤数据。单独选择输入正常工作。我尝试类似

output$tbl<-renderTable({subset(data,data$country==input$countryIn|| data$code==input$code)})

但它无效。我希望该用户选择国家/地区,然后将代码写入textinput并减少数据区域。

ui.R
library(shiny)



shinyUI(fluidPage(

titlePanel("This is my website"),  

sidebarLayout(

sidebarPanel(uiOutput(outputId="country"),textInput(inputId="code",label="writte code")),

mainPanel(tableOutput(outputId="tbl"))


))
)
server.R
library(shiny)

id<-1:6
country<-c("Germany","UK","USA","Poland","UK","UK")
code<-c(255,124,234,751,124,326)
data<-data.frame(id,country,code)


shinyServer(

function(input,output)
{
output$country<-renderUI({selectInput(inputId ="countryIn",label="Choose country",choices=unique(data$country))})
output$tbl<-renderTable({subset(data,data$country==input$countryIn)})
})

2 个答案:

答案 0 :(得分:0)

首先,我重构了你的代码,因为它真的很难为我阅读。 (我还将这两个文件合并到app.R,但没有必要)

第二:你使用了错误的逻辑运算符。在这种情况下使用||有两个问题:

  1. 您需要使用&&&运算符,而不是|||,因为您希望按2个条件进行过滤。

  2. 较长的表单从左到右计算仅检查每个向量的第一个元素。这不是你想要的,你需要检查向量的所有元素是否等于过滤条件。

  3. 所以你写subset(data, data$country == input$countryIn & data$code == input$code),但由于textInput的默认值是一个空字符串(""),它仍然不能正常工作,它赢了& #39; t产生任何结果。

    因此,有两种情况:数据仅由code过滤,而另一种过滤器都在运行。您可以使用if语句:

      output$tbl <- renderTable( {
        if(input$code == "") subset(data, data$country == input$countryIn)
        else subset(data, data$country == input$countryIn & data$code == input$code)
      })  
    

    请注意,您可能希望延迟验证,因为慢慢输入textInput字段会刷新表格。

    完整代码:

    library(shiny)
    
    id <- 1:6
    country <- c("Germany", "UK", "USA", "Poland", "UK", "UK")
    code <- c(255,124,234,751,124,326)
    data <- data.frame(id, country, code)
    
    
    ui <- fluidPage(
      titlePanel("This is my website"),
      sidebarLayout(
        sidebarPanel(
          uiOutput(outputId="country"),
          textInput(inputId="code",label="writte code")),
        mainPanel(tableOutput(outputId="tbl"))
      )
    )
    
    server <- function(input,output) {
      output$country <- renderUI( {
        selectInput(inputId ="countryIn", label="Choose country", choices=unique(data$country))
      })
    
      output$tbl <- renderTable( {
        if(input$code == "") subset(data, data$country == input$countryIn)
        else subset(data, data$country == input$countryIn & data$code == input$code)
      })
    }
    
    shinyApp(ui, server)
    

答案 1 :(得分:0)

有几种方法可以做到这一点。但是,最简单的方法是使用if - else子句,如下所示:

output$tbl<-renderTable({
        if(input$code == ""){
          subset(data, input$countryIn == data$country)
        } else{
          subset(data, input$code == data$code & input$countryIn == data$country)
        }
      })