You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于HTML交互式DT表格筛选结果更新Plotly散点图

Answer

Absolutely! You can embed Shiny code in your R Markdown-generated HTML to link DT table filters to your Plotly scatter plot—this is exactly what R Markdown's Shiny runtime is designed for. Below is a complete, annotated modification of your code that implements this functionality, plus explanations of the key pieces you need to understand.

Core Concept

We'll use Shiny's reactive programming to:

  1. Capture the filtered rows from your DT table
  2. Feed that filtered data into your Plotly scatter plot automatically whenever the table's filters change

Complete Modified R Markdown Code

---
title: "Filter interative plots from table results"
date: "`r format(Sys.time(), '%B %e, %Y')`"
output:
  html_document:
    theme: flatly
    toc: yes
    toc_float: yes
    number_sections: true
runtime: shiny  # Critical: Enables Shiny's interactive runtime in the HTML
---
{setup, include=FALSE, cache=TRUE}
# Load required packages (note we add shiny here!)
library(DT)
library(plotly)
library(stringr)
library(shiny)

data(mtcars)

# Clean your data as before
mtcars$car <- rownames(mtcars)
mtcars$car <- stringr::str_replace(mtcars$car, ' ', '_')
rownames(mtcars) <- NULL
Interactive Table & Linked Scatter Plot
# 1. Reactive object to capture filtered table data
# This updates automatically whenever the DT table's filters change
filtered_data <- reactive({
  # input$mtcars_table_rows_all gives us the indices of all visible rows in the table
  mtcars[input$mtcars_table_rows_all, ]
})

# 2. Render the interactive DT table (with an outputId for Shiny to track)
output$mtcars_table <- DT::renderDataTable({
  DT::datatable(mtcars, filter = list(position = "top"), selection="none",
                options = list(columnDefs = list(list(visible=FALSE, targets=2)),
                               searchHighlight=TRUE,
                               pagingType= "simple",
                               pageLength = 10,
                               server = TRUE,  # Required: Enables server-side processing to track filtered rows
                               processing = FALSE)) %>%
    formatStyle(columns = 'qsec',
                background = styleColorBar(range(mtcars$qsec), 'lightblue'),
                backgroundSize = '98% 88%',
                backgroundRepeat = 'no-repeat',
                backgroundPosition = 'center')
})

# Display the DT table
DT::dataTableOutput("mtcars_table")

# 3. Render the Plotly scatter plot using the filtered data
output$scatter_plot <- plotly::renderPlotly({
  plot_ly(data = filtered_data(), x = ~disp, y = ~mpg, type = 'scatter', mode = 'markers',
          text = ~paste("Car: ", car, "\n", "Mpg: ", mpg, "\n"),
          color = ~mpg, colors = "Spectral", size = ~-disp )
})

# Display the scatter plot
plotly::plotlyOutput("scatter_plot", width = "800px", height = "800px")

Key Details to Understand

  • runtime: shiny: This line in the YAML header is non-negotiable—it tells R Markdown to generate an HTML file that can run Shiny's interactive logic.
  • Server-side processing (server = TRUE): Enabling this in your DT options lets Shiny track which rows are visible after filtering. Without this, input$mtcars_table_rows_all won't update correctly.
  • Reactive data (filtered_data()): This is the glue between your table and plot. It automatically refreshes whenever the table's filters change, and your plot uses this data instead of the full mtcars dataset.
  • Shiny output/input pairing: We use renderDataTable() + dataTableOutput() for the table, and renderPlotly() + plotlyOutput() for the plot. The outputId (here mtcars_table) connects the rendered table to the input Shiny uses to track filters.

How to Use This

  1. Make sure you have all required packages installed: run install.packages(c("shiny", "DT", "plotly", "stringr")) if needed.
  2. Replace your existing R Markdown code with this modified version.
  3. Click the Run Document button in RStudio—this will generate an HTML file. Open it in your browser, and you'll see that filtering the table (e.g., searching for "maz") automatically updates the scatter plot to only show matching cars.

内容的提问来源于stack exchange,提问作者fugu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:31:16