您好我需要帮助通过输入过滤数据。单独选择输入正常工作。我尝试类似
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)})
})
答案 0 :(得分:0)
首先,我重构了你的代码,因为它真的很难为我阅读。 (我还将这两个文件合并到app.R
,但没有必要)
第二:你使用了错误的逻辑运算符。在这种情况下使用||
有两个问题:
您需要使用&
,&&
运算符,而不是|
,||
,因为您希望按2个条件进行过滤。
较长的表单从左到右计算仅检查每个向量的第一个元素。这不是你想要的,你需要检查向量的所有元素是否等于过滤条件。
所以你写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)
}
})