说我有一个带有数据表和绘图的Shiny应用程序。我希望能够搜索/过滤数据表,并绘制出反映结果的图表。
我该怎么做?这有可能吗?有什么方法可以将过滤后的数据表输出到我可以使用的对象?
这是一个基本的闪亮应用程序,无法正常工作。
library(DT)
ui <- basicPage(
h2("The mtcars data"),
DT::dataTableOutput("mytable"),
plotOutput('plot1')
)
server <- function(input, output) {
output$mytable = DT::renderDataTable({
datatable(mtcars,filter = 'top')
})
output$plot1 <- renderPlot({
plot(input$mytable$wt, input$mytable$mpg)
})
}
shinyApp(ui, server)
答案 0 :(得分:3)
我已经对您的代码进行了一些编辑,因为您的方式存在@ r2evans指出的错误。
无论如何,您可以使用input$tableId_rows_all
获取数据表的过滤行。它提供了所有页面上的行索引(在表被搜索字符串过滤之后)。
在我的代码中,filtered_table()
在应用所有搜索过滤器后为您提供了一个数据框对象。 output$test
实时显示此表。
library(shiny)
library(DT)
ui <- basicPage(
h2("The mtcars data"),
DT::dataTableOutput("mytable"),
verbatimTextOutput("test"),
plotOutput('plot1')
)
server <- function(input, output) {
mc <- head(mtcars) # could be reactive in real world case
output$mytable = DT::renderDataTable({
datatable(mc, filter = 'top')
})
filtered_table <- reactive({
req(input$mytable_rows_all)
mc[input$mytable_rows_all, ]
})
output$plot1 <- renderPlot({
plot(filtered_table()$wt, filtered_table()$mpg, col = "red", lwd = 10)
})
output$test <- renderPrint({
filtered_table()
})
}
shinyApp(ui, server)
答案 1 :(得分:1)
建议:
sum(1,2);
function sum(first, second) {
return first + second;
}
中的 Tour input$mytable
参考只是一个字符串,而不是您希望的框架,因此需要替换它。您可以对output$plot1
进行硬编码,但是对数据进行硬编码并不能真正带来可扩展的交互式体验。
此外,由于您将在两个不同的块(mtcars
和$mytable
)中显示相同的数据,因此建议将数据分成其自己的反应块并引用该块在其他人中。
最后,我认为在块中使用$plot1
是一种好的防御做法,这样它们就不会在数据可用之前尝试执行(常见于反应性路径不清楚或尚未设置输入的情况) )。
尝试一下:
req(...)