首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直接在onRender()函数htmlWidgets中的亮反应值

直接在onRender()函数htmlWidgets中的亮反应值
EN

Stack Overflow用户
提问于 2017-05-01 20:22:22
回答 1查看 767关注 0票数 3

我有一个闪亮的应用程序有两个情节。如果用户单击顶部图中的某个点,则将该点的x和y坐标保存到一个反应性的闪亮变量中(在下面的代码中,它称为pointSel)。

在下面的图中,我希望这个pointSel中的x和y坐标被绘制成一个绿点。我目前正在工作(如下面的脚本所示)。但是,每次更新pointSel对象时,都会再次绘制第二幅图。相反,我试图保持第二个地块背景未绘制,并简单地覆盖一个新的绿点在上面。

我相信这需要两件事:

1)应用于onRender()函数中的"data =onRender()“的隔离()函数。

2)一些语法,提醒只添加绿点跟踪,如果pointSel已经更新。我在注释"$('#pointSel').on('click',function()“中添加了这方面的暂定语法。

下面是我的代码:

代码语言:javascript
复制
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)

注:这是一个类似的问题,我刚才张贴,并有一个有用的答案(Shiny actionButton() output in onRender() function of htmlWidgets)。我遇到了这个问题的变体(无法将绘图的各个方面覆盖到onRender()函数中的背景图),而当前的文章只是该问题的另一个变体。我正试图为这种情况找到一个类似的答案!谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-02 11:47:14

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

第二幅图的onRender函数可能如下所示:

代码语言:javascript
复制
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中,你可以做到:

代码语言:javascript
复制
  observe({
    session$sendCustomMessage(type = "draw_point", input$pointSel)
  })

只要选择了一个点,坐标就会发送到onRender中定义的函数中,并绘制点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43725957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档