从 R shiny 中的 selectInput 过滤
Filtering from selectInput in R shiny
我正在尝试让用户上传 .csv 文件,然后获取该 .csv 文件的列(因子)并创建用户输入以确定该字段中的哪些唯一名称将是 select为数据框编辑。
所以如果我有下面的例子data.frame:
COURSE VALUE
1 A 7
2 C 2
3 C 2
4 B 9
...
我想使用 Select_Input 进行过滤,用户可以 select select 说 A 和 C,然后数据框将只针对具有 A 和 C 的行进行过滤。下面是为 select_Input
生成 UI 的代码
output$choose_course<-renderUI{
# If missing input, return to avoid error later in function
if(is.null(input$model.input))
return()
# Get the data set with the appropriate name
course.names <-c("All",as.vector(t(unique(select_(model.data0(),"COURSE")))))
selectInput("courses","Choose courses", choices=course.names, multiple=TRUE)
}
请注意,model.data0() 是用户通过 .csv 文件输入的反应数据。代码的第一部分工作正常(但格式可能会弄乱接下来的内容?)并显示用户输入 selections。接下来我们尝试从 selectInput...
中过滤
model.data<-reactive({
if(is.null(input$model.input))
return()
localdata<-model.data0()
if(input$courses!="All"){
localdata<-localdata[localdata$COURSE==unlist(input$courses),]
}
})
然而,这returns一个"argument 1 (type 'list') cannot be handled by 'cat' "的错误。我尝试了上面的 unlist 将其更改为 vector 但似乎没有用。我有什么想法可以让这个过滤器成为我的数据吗?
您可以尝试这样做:
require(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput('choose_course')
),
mainPanel(
tableOutput('courseTable')
)
)
)
server <- function(input, output, session) {
# Build data, would be replaced by the csv loading in your case
n <- 10
model.data0 <- reactive ({
data.frame( "COURSE" = sample(LETTERS[1:3], n, replace=TRUE),
"VALUE" = sample(1:10, n, replace=TRUE))
})
# Render selectInput
output$choose_course <- renderUI({
course.names <- as.vector( unique(model.data0()$COURSE) )
selectInput("courses","Choose courses", choices=course.names, multiple=TRUE)
})
# Subset so that only the selected rows are in model.data
model.data <- reactive({
subset(model.data0(), COURSE %in% input$courses)
})
output$courseTable <- renderTable({ model.data() })
}
runApp(shinyApp(ui,server))
我正在尝试让用户上传 .csv 文件,然后获取该 .csv 文件的列(因子)并创建用户输入以确定该字段中的哪些唯一名称将是 select为数据框编辑。
所以如果我有下面的例子data.frame:
COURSE VALUE
1 A 7
2 C 2
3 C 2
4 B 9
...
我想使用 Select_Input 进行过滤,用户可以 select select 说 A 和 C,然后数据框将只针对具有 A 和 C 的行进行过滤。下面是为 select_Input
生成 UI 的代码output$choose_course<-renderUI{
# If missing input, return to avoid error later in function
if(is.null(input$model.input))
return()
# Get the data set with the appropriate name
course.names <-c("All",as.vector(t(unique(select_(model.data0(),"COURSE")))))
selectInput("courses","Choose courses", choices=course.names, multiple=TRUE)
}
请注意,model.data0() 是用户通过 .csv 文件输入的反应数据。代码的第一部分工作正常(但格式可能会弄乱接下来的内容?)并显示用户输入 selections。接下来我们尝试从 selectInput...
中过滤model.data<-reactive({
if(is.null(input$model.input))
return()
localdata<-model.data0()
if(input$courses!="All"){
localdata<-localdata[localdata$COURSE==unlist(input$courses),]
}
})
然而,这returns一个"argument 1 (type 'list') cannot be handled by 'cat' "的错误。我尝试了上面的 unlist 将其更改为 vector 但似乎没有用。我有什么想法可以让这个过滤器成为我的数据吗?
您可以尝试这样做:
require(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput('choose_course')
),
mainPanel(
tableOutput('courseTable')
)
)
)
server <- function(input, output, session) {
# Build data, would be replaced by the csv loading in your case
n <- 10
model.data0 <- reactive ({
data.frame( "COURSE" = sample(LETTERS[1:3], n, replace=TRUE),
"VALUE" = sample(1:10, n, replace=TRUE))
})
# Render selectInput
output$choose_course <- renderUI({
course.names <- as.vector( unique(model.data0()$COURSE) )
selectInput("courses","Choose courses", choices=course.names, multiple=TRUE)
})
# Subset so that only the selected rows are in model.data
model.data <- reactive({
subset(model.data0(), COURSE %in% input$courses)
})
output$courseTable <- renderTable({ model.data() })
}
runApp(shinyApp(ui,server))