r- htmlwidgets的onRender()函数中的闪亮反应值



我有一个有两个图的闪亮应用程序。如果用户点击顶部图中的一个点,则将该点的X和Y坐标保存到反应性闪亮变量(在下面的代码中,称为PointSel(。

在底部图中,我希望将x和y坐标从该点绘制为绿点。我当前有此工作(如下所示(。但是,每次更新PointSel对象时,第二个图都会再次绘制。取而代之的是,我试图将第二个情节背景保持不足,并简单地叠加在其顶部的新绿点。

我相信这需要两件事:

1(在OnRender((函数中应用于" data = pointsel(("的孤立((函数。

2(一些语法,该语法仅在更新点SELS时才添加绿色点跟踪。我在注释" $('#pointsel'(。on('click'',function((。

以下是我的代码:

library(plotly)
library(GGally)
library(hexbin)
library(htmlwidgets)
library(tidyr)
library(shiny)
library(edgeR)
library(EDASeq)
library(dplyr)
library(data.table)
library(ggplot2)
ui <- shinyUI(fluidPage(
  plotlyOutput("plot1"),
  plotlyOutput("plot2")
))
server <- shinyServer(function(input, output) {
  data <- data.frame(mpg=mtcars$mpg,qsec=mtcars$qsec)
  output$plot1 <- renderPlotly({
    p <- qplot(data$mpg,data$qsec)
    pP <- ggplotly(p)
    pP %>% onRender("
      function(el, x, data) {
      el.on('plotly_click', function(e) {
        var pointSel = [e.points[0].x, e.points[0].y]
        Shiny.onInputChange('pointSel', pointSel);
      })}
      ", data = data)
  })
  pointSel <- reactive(input$pointSel)
  output$plot2 <- renderPlotly({
    p2 <- qplot(mpg,qsec,data=data, geom="point", alpha=I(0))
    pP2 <- ggplotly(p2)
    pP2 %>% onRender("
      function(el, x, data) {
        console.log('Whole bottom plot is being redrawn')
        var myX = data[0]
        var myY = data[1]
      //$('#pointSel').on('click',function() {
        var Traces = [];
        var trace = {
          x: [myX],
          y: [myY],
          mode: 'markers',
          marker: {
            color: 'green',
            size: 10
          }
        };
        Traces.push(trace);
        Plotly.addTraces(el.id, Traces);
      //})
    }", data = pointSel())
  })
})
shinyApp(ui, server)

注意:这与我之前发布的内容类似,并且在htmlwidgets的onrender((函数中具有有用的答案(Shiny ActionButton((输出(。我已经遇到了这个问题的变体(无法将图的方面叠加到OnRender((函数中的背景图(,而当前帖子只是该问题的另一个变体。我试图为这种情况找到类似的答案!谢谢您的任何建议。

您可以使用onRender功能中的定义自定义消息处理程序,并在server.R中使用它来传递所选点坐标。

第二个图的onRender功能看起来像:

function(el, x, data) {
  Shiny.addCustomMessageHandler('draw_point',
  function(point) {
    var Traces = [];
    var trace = {
      x: [point[0]],
      y: [point[1]],
      mode: 'markers',
      marker: {
        color: 'green',
        size: 10
      }
    };
    Traces.push(trace);
    console.log(Traces);
    Plotly.addTraces(el.id, Traces);
  });
}

,在您的server.R中,您可以做:

  observe({
    session$sendCustomMessage(type = "draw_point", input$pointSel)
  })

每当选择一个点时,坐标将发送到onRender中定义的函数,并将绘制点。

相关内容

  • 没有找到相关文章

最新更新