是否有可能实现与多个分类轴的Shiny情节交互?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有可能实现与多个分类轴的Shiny情节交互?相关的知识,希望对你有一定的参考价值。

我正在创建我的第一个Shiny应用程序,当用户使用鼠标事件与ggplot对象(plot)交互时返回数据表。使用来自RStudio的this example,我已经能够根据x轴(切割)上的位置生成过滤并返回数据表(菱形)的东西。它差不多......但是,我有两个我无法解决的突出问题:

  1. 是否可以根据鼠标事件返回数据表,该事件由y轴(颜色)和x轴(切割)过滤?
  2. 从(1)开始,数据表是否可以进一步过滤,以便只返回该方面的信息(类型)?

这是我使用可重现代码的地方:

library(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
  fluidRow(
    plotOutput("plot1", click = "plot1_click")),
  fluidRow(column(width = 10, dataTableOutput("selected_rows"))))

server <- function(input, output) {

  is.even <- function(x) x %% 2 == 0

  plot <- diamonds %>%
    mutate(cut = as.factor(cut)) %>%
    mutate(colour = as.factor(color)) %>%
    mutate(type = is.even(price)) %>%
    group_by(type, color, cut) %>%
    count()

  output$plot1 <- renderPlot({
    ggplot(plot, aes(x = cut, y = color, colour = type)) +
      geom_point(aes(size = n)) +
      facet_grid(~type) +
      theme(legend.position = "none")
  })

  output$selected_rows <- renderDataTable({
    if (is.null(input$plot1_click$x)) return()

    keeprows <- round(input$plot1_click$x) == as.numeric(diamonds$cut)
    diamonds[keeprows, ]
  })
}

shinyApp(ui, server)

任何帮助将非常感激。提前致谢。

答案

我相信如果你在output$selected_rows中做更多的逻辑,这是可能的。要通过y变量进行过滤,只需添加对input$plot1_click$y的引用即可。对于facet(或panels),你会想要使用input$plot1_click$panelvar1

keeprows_x     <- round(input$plot1_click$x) == as.numeric(diamonds$cut)
keeprows_y     <- round(input$plot1_click$y) == as.numeric(diamonds$color)
keeprows_panel <- input$plot1_click$panelvar1 == is.even(diamonds$price)
diamonds[keeprows_x & keeprows_y & keeprows_panel, ]

注意:我用type模仿is.even(diamonds$price)的逻辑。您可能希望查看this github issue以获得进一步的讨论和解决方案。

以上是关于是否有可能实现与多个分类轴的Shiny情节交互?的主要内容,如果未能解决你的问题,请参考以下文章

将多个情节图下载到 PDF Shiny

在智能手机上使用,闪亮的交互式情节无法理解手指动作

在 R 中用 Shiny 绘制散点图;情节没有更新,也没有完全互动

情节:具有“链接”交互性的多个情节

R shiny:在交互式 3d 图中结合选择和滑块

用情节 Shiny R 制作累积图形