在Shiny App中,我希望根据数据表中的搜索结果来更新图表。

时间:2018-10-18 18:48:40

标签: r shiny

说我有一个带有数据表和绘图的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)

2 个答案:

答案 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)

enter image description here

答案 1 :(得分:1)

建议:

    sum(1,2); function sum(first, second) { return first + second; } 中的
  • Tour input$mytable参考只是一个字符串,而不是您希望的框架,因此需要替换它。您可以对output$plot1进行硬编码,但是对数据进行硬编码并不能真正带来可扩展的交互式体验。

  • 此外,由于您将在两个不同的块(mtcars$mytable)中显示相同的数据,因此建议将数据分成其自己的反应块并引用该块在其他人中。

  • 最后,我认为在块中使用$plot1是一种好的防御做法,这样它们就不会在数据可用之前尝试执行(常见于反应性路径不清楚或尚未设置输入的情况) )。

尝试一下:

req(...)

working shiny example