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

时间:2018-03-02 01:52:46

标签: r ggplot2 shiny

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

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

    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)
    

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

1 个答案:

答案 0 :(得分:1)

我相信如果你在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以获得进一步的讨论和解决方案。