在htmlWidgets的onRender()函数中输出闪亮的actionButton()

时间:2017-04-29 20:33:12

标签: shiny plotly htmlwidgets onrender

我的目标是创建一个脚本,最初显示一个空白的图表。如果用户点击Shiny actionButton说"添加点",那么点将通过htmlWidgets的onRender()函数添加到plotly图中。这将是有效的,因为当用户选择Shiny actionButton时,不需要重新绘制背景空白图表。

然而,为了让我实现这一点,我需要找出一种方法来指示Shiny actionButton中的变化直接进入onRender()函数,以便空白的plotly图形(在下面的代码中称为&# 34; pP")根本不会改变。我在下面的onRender()代码中将两条注释行作为if语句来显示我的目标。

我知道有一个名为Shiny.onInputChange('变量',变量)的函数可以在onRender()函数内调用,以保存在onRender()内创建的变量,这样就可以了像onRender()函数之外的Shiny输入一样使用。所以,我想我正在寻找反向的东西(将闪亮的输入值直接传递到onRender()函数中)。

ui <- shinyUI(fluidPage(
  uiOutput("add"),
  plotlyOutput("myPlot", height = 700)
))

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

  output$add <- renderUI({
    actionButton("addButton", "Add points")
  })

  output$myPlot <- renderPlotly({
    p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_blank()
    pP <- ggplotly(p)

    pP %>% onRender("
    function(el, x, data) {

//if (input$addButton selected){
      var Traces = [];
      var trace = {
      x: data.x,
      y: data.y,
      mode: 'markers',
      marker: {
      color: 'green',
      size: 6
      },
      hoverinfo: 'none'
      };
      Traces.push(trace);
      Plotly.addTraces(el.id, Traces);
//}
    }", data = list(x = mtcars$wt, y = mtcars$mpg))
  })      
})

shinyApp(ui, server)

注意:这与我之前提到的问题类似(Using Shiny actionButton() function in onRender() function of htmlWidgets)。但是,我简化了问题,并希望确定是否有可用的简单答案。

1 个答案:

答案 0 :(得分:2)

你可以尝试直接使用一些jQuery来响应用户点击按钮。 onRender将是:

function(el, x, data) {
  $('#addButton').on('click',function() {
    var Traces = [];
    var trace = {
      x: data.x,
      y: data.y,
      mode: 'markers',
      marker: {
        color: 'green',
        size: 6
      },
      hoverinfo: 'none'
    };
    Traces.push(trace);
    Plotly.addTraces(el.id, Traces);
  })
}

要实现此功能,首先需要创建按钮,因此我将ui.R更改为:

ui <- shinyUI(fluidPage(
  actionButton("addButton", "Add points"),
  plotlyOutput("myPlot", height = 700)
))

编辑:如果您想保留renderUI,可以使用事件委派来绑定#add div中的功能按钮:

function(el, x, data) {
  $('#add').on('click','button',function() {
    var Traces = [];
    var trace = {
      x: data.x,
      y: data.y,
      mode: 'markers',
      marker: {
        color: 'green',
        size: 6
      },
      hoverinfo: 'none'
    };
    Traces.push(trace);
    Plotly.addTraces(el.id, Traces);
  })
}