如何在闪亮的服务器(HTMLWIDGETS/R)中修改JS变量



这个问题比对特定代码明确的概念更概念性,所以我想这次没有玩具代码。

我有一个相当大的闪亮应用程序,它使用了一些D3.js脚本。当调用update函数时,D3对象访问一些全局变量。我想从闪亮的服务器中控制这些变量 - 这是否可能?

此应用假定全局变量分配给window。然后,它使用自定义消息处理程序创建原始变量(#1(,而另一个可以操纵该变量的值(#2(。

编辑将消息发送回R带有全局变量的状态。

R代码:

library(shiny)
ui <- fluidPage(
# Application title
titlePanel("Global Variable Manipulation"),
  mainPanel(
    sliderInput("data", "Element", min = 0, max = 100, value = 0),
    actionButton("go", "GO"),
    textOutput("var"),
    singleton(
      tags$head(tags$script(src = "message-handler.js"))
    ),
    singleton(
      tags$head(tags$script(src = "message-handler2.js"))
    ),
    singleton(
      tags$head(tags$script(src = "back-to-shiny.js"))
    )
  )
)

server <- function(input, output, session) {
  observe({
    session$sendCustomMessage(type = 'testmessage',
                              message = list(a = 1, b = 'text',
                                             controller = input$data))
  })
  observeEvent(input$go,{
    session$sendCustomMessage(type = 'changeMessage',
                              message = list(2))
  })
  output$var <- renderPrint({
    input$jsvalue
  })
}
# Run the application 
shinyApp(ui = ui, server = server)

Message Handler.js代码:

Shiny.addCustomMessageHandler("testmessage",
  function(message) {
     window.globalVar = message.controller
    alert(JSON.stringify(window.globalVar));
  }
);

message handler2.js代码:

Shiny.addCustomMessageHandler("changeMessage",
  function(message) {
    window.globalVar = window.globalVar-message;
    alert(JSON.stringify(window.globalVar));
  }
);

back-shiny.js代码:

setInterval(function(){
    var message = window.globalVar;   
    Shiny.onInputChange("jsvalue", message);
},0);

相关内容

  • 没有找到相关文章

最新更新