有没有办法在 ggiraph (R shiny) 中预选点?

Is there a way to preselect points in ggiraph (R shiny)?

我想在 ggiraph::renderggiraph() 输出中预 select 一些点。

我可以制作以下闪亮的应用程序,它允许我 select 点,然后像这样在其他地方使用这些 selected 点:

dat <- data.table(x = 1:6, y = 1:6 %% 3, id = 1:6, status = rep(c('on','off'),3))

ui <- fluidPage(   ggiraphOutput("plot"),
                   verbatimTextOutput("choices"))

server <- function(input, output, session){


  output$plot <- renderggiraph({
    p <- ggplot(dat ) +
      geom_point_interactive(aes(x = x, y = y, data_id = id), size = 5) + 
      scale_color_manual(limits = c('on','off'),values = c('red','black')) 

    ggiraph(code = print(p),
            hover_css = "fill:red;cursor:pointer;",
            selection_type = "multiple",
            selected_css = "fill:red;")
  })

  output$choices <- renderPrint({

  input$plot_selected
  })


}

shinyApp(ui = ui, server = server)

但有时我想在初始化应用程序之前对某些点进行 selected。 例如,如果点 1、3 和 5 本来就已经 "on",我希望用户能够将它们变为 "off"。

所以我的问题是,是否有可能实现这样的目标?

是的,通过在 session$onFlushed 中使用 session$sendCustomMessage:

library(shiny)
library(ggiraph)
library(data.table)
library(magrittr)
dat <- data.table(x = 1:6, y = 1:6 %% 3, id = 1:6, status = rep(c('on','off'),3))

ui <- fluidPage(   fluidRow(
  column(width = 7, 
         ggiraphOutput("ggobj") ),
  column(width = 5, verbatimTextOutput("choices"))
) )

server <- function(input, output, session){

  output$ggobj <- renderggiraph({
    p <- ggplot(dat ) +
      geom_point_interactive(aes(x = x, y = y, data_id = id), size = 5) + 
      scale_color_manual(limits = c('on','off'),values = c('red','black')) 

    ggiraph(code = print(p),
            hover_css = "fill:red;cursor:pointer;",
            selection_type = "multiple",
            selected_css = "fill:red;")
  })
  session$onFlushed(function(){
    session$sendCustomMessage(type = 'ggobj_set', message = 1:3)
  })
  output$choices <- renderPrint({
    input$ggobj_selected
  })


}

shinyApp(ui = ui, server = server)