[英]Filter data table output using user input in R shiny
I am working on an app which allows the user to select specific inputs. 我正在开发一个允许用户选择特定输入的应用程序。 In this case the app provides two selectizeInput options to select from the various options. 在这种情况下,该应用程序提供了两个selectizeInput选项以从各种选项中进行选择。
The following is the dataset: 以下是数据集:
data_test = data.frame(Name = c ("ABC","ABC","ABC","DEF","DEF", "XYZ", "XYZ", "PQR"),
Country = c("US, Japan","US, Japan","US, Japan","Canada, US","Canada, US", "UK, US", "UK, US", "Germany"),
Region = c("North America, Asia","North America, Asia","North America, Asia","North America","North America", "Europe, North America", "Europe, North America", "Europe"),
Contact = c(1234,1234,1234,7578,7578,9898,9898,7660),
ContactPerson = c("Geoff","Mary","Mike","Don","Sean","Jessica","Justin","John"))
In ui.R 在ui
dashboardPage(skin = "blue",
dashboardHeader(title = 'My APP'),
dashboardSidebar(
sidebarMenu(
menuItem("Profiles", tabName = "profiles", icon=icon("user")),
menuItem("Search", tabName = "search", icon=icon("search")),
menuItem("About App", tabName="about", icon = icon("info"))
)
),
dashboardBody(
tabItems(
tabItem(tabName ="profiles",
tabBox( title = "",
width = 12, id = "tabset1", height = "850px",
tabPanel("People",
fluidRow(
box(title = "Filters", solidHeader = TRUE,
background = "blue" , collapsible = TRUE, width = 12,
fluidRow(
column(4,selectizeInput("country",label="Country",choices= NULL, multiple = TRUE)),
column(4,selectizeInput("geogPref",label="Region",choices= NULL, multiple = TRUE))
)
)
),
box(title = "Filtered Results",
collapsible = TRUE, status = "success",
width = 12, DT::dataTableOutput('results'))
),
tabPanel("Details",
fluidRow(
box(width = 4, background = "blue",
collapsible = TRUE, solidHeader = TRUE)
)
)
)
),
tabItem(tabName ="search",
titlePanel("Search"),
fluidRow(
)
),
tabItem(tabName="about",
titlePanel("About APP"),
HTML("This is an app.")
)
)
)
)
In server.R 在server.R中
library(shiny)
trim.leading <- function (x) sub("^\\s+", "", x)
uniqueValues <- function(x){
values <- c()
s <- (unlist(strsplit(x, ",", fixed = TRUE)))
v <- trim.leading(s)
}
geog <- c()
geog <- unique(unlist(c(geog, sapply(data_set$Region, uniqueValues))))
shinyServer(function(input, output, session) {
updateSelectizeInput(session, 'country', choices = unique(data_set$Country), server = TRUE)
updateSelectizeInput(session, 'geogPref', choices = geog, server = TRUE)
country <- reactive({
c <- c()
c <- c(c, input$country)
})
dataset <- reactive({
data <- data_set
if (input$country){
data$c1 <- grepl(paste(country(), collapse = "|"), data$Country)
}
else {
data$c1 <- TRUE
}
if (input$geogPref){
data$c2 <- grepl(input$geogPref, data$Region)
}
else {
data$c2 <- TRUE
}
data <- data[which(data$c1 == TRUE & data$c2 == TRUE ),c("Name", "Contact", "ContactPerson")]
return (data)
})
output$results <- DT::renderDataTable(
DT::datatable( unique(dataset()),
rownames = FALSE, options = list(searchable = FALSE)
)
})
So based on the user selection, I need to filter out the rows that contain all those strings and update the table with only those relevant rows. 因此,根据用户选择,我需要过滤出包含所有这些字符串的行,并仅使用那些相关的行来更新表。 I am not able to update the table with the filters. 我无法使用过滤器更新表格。 With this code I am getting, this error: 有了这段代码,我得到了这个错误:
Error in if: argument is of length zero
Stack trace (innermost first):
96: <reactive:dataset> [D:\shinyapps\myapp/server.R#21]
85: dataset
84: unique
83: DT::datatable
82: exprFunc
Can someone help with what I am doing wrong? 有人可以帮我解决我做错的事情吗?
You can simplify the server code: 您可以简化服务器代码:
shinyServer(function(input, output, session) {
updateSelectizeInput(session, 'country', choices = unique(data_set$Country), server = TRUE)
updateSelectizeInput(session, 'geogPref', choices = geog, server = TRUE)
dataset <- reactive({
data <- data_set
if (length(input$country)){
data$c1 <- grepl(paste(input$country, collapse = "|"), data$Country)
}
else {
data$c1 <- TRUE
}
if (length(input$geogPref)){
data$c2 <- grepl(paste(input$geogPref, collapse = "|"), data$Region)
}
else {
data$c2 <- TRUE
}
data[data$c1 & data$c2 ,c("Name", "Contact", "ContactPerson")]
})
output$results <- DT::renderDataTable(
DT::datatable( dataset(),
rownames = FALSE, options = list(searchable = FALSE)
))
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.