我目前正在尝试创建一个R闪亮的应用程序,用户可以搜索每行中的多个列。此功能使用闪亮环境之外的datatable
包中的DT
函数。以iris
数据集为例,我想搜索包含值的所有行; 5.1,3.5和1.4。如果我在交互式数据表窗口“5.1 3.5 1.4”的搜索框中键入以下字符串,则显示第1行和第18行。
library(DT)
head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
datatable(iris)
问题是当我在闪亮的环境中尝试做同样的事情时,我会收到消息
找不到匹配的记录。
例如:
if (interactive()) {
library(shiny)
shinyApp(
ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
server = function(input, output) {
output$tbl = DT::renderDataTable(
iris, options = list(lengthChange = FALSE)
)
}
)
}
有没有人可以解决,或者可以告诉我我做错了什么?
答案 0 :(得分:2)
对于server=FALSE
renderDataTable
函数if (interactive()) {
library(shiny)
shinyApp(
ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
server = function(input, output) {
output$tbl = DT::renderDataTable(
iris, options = list(lengthChange = FALSE), server = FALSE
)
}
)
}
,您需要遇到同样问题的其他人。
chart.export = {
enabled: true,
position: "bottom-right"
}
chart.initHC = false;
chart.validateNow();
答案 1 :(得分:1)
更新:我已在服务器端处理模式下实施smart filtering,默认情况下已启用。使用 DT > = 0.2.29,它应该开箱即用:
devtools::install_github('rstudio/DT')
library(shiny)
shinyApp(
ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
server = function(input, output) {
output$tbl = DT::renderDataTable(
iris, options = list(search = list(search = '5.1 3.5 1.4'))
)
}
)
您可以忽略下面的旧答案。
您可以在搜索中启用正则表达式(see more examples in the DT documentation)。
library(shiny)
shinyApp(
ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
server = function(input, output) {
output$tbl = DT::renderDataTable(
iris, options = list(search = list(regex = TRUE))
)
}
)
在上面的例子中,我使用了正则表达式5.1|3.5|1.4
。请注意,这意味着“在任何列中找到值5.1,3.5,或 1.4”。如果您需要在第一列中找到5.1,在第二列中找到3.5,在第三列中找到1.4,则在使用单个搜索字符串的服务器端处理模式中无法执行此操作(单个正则表达式无法表达这个)。您必须使用客户端处理(即server = FALSE
,如您所发现的),或者对列进行排序以找到所需的组合:
或使用列过滤器过滤各列:
library(shiny)
shinyApp(
ui = fluidPage(fluidRow(column(12, DT::dataTableOutput('tbl')))),
server = function(input, output) {
output$tbl = DT::renderDataTable(
iris, filter = 'top'
)
}
)