D3.js 如何在闪亮服务器(htmlwidgets/R)中修改js变量

D3.js 如何在闪亮服务器(htmlwidgets/R)中修改js变量,d3.js,shiny,shiny-server,htmlwidgets,D3.js,Shiny,Shiny Server,Htmlwidgets,这个问题更多的是概念性的,而不是明确的,所以我想这次没有玩具代码 我有一个相当大的闪亮应用程序,它使用了一些d3.js脚本。D3对象在调用其update函数时访问一些全局变量。我想从闪亮服务器控制这些变量-这可能吗?此应用程序假定全局变量已分配给窗口。然后,它使用一个自定义消息处理程序来创建原始变量(#1),并使用另一个来操作该变量(#2)的值 编辑以将带有全局变量状态的消息发送回R R代码: library(shiny) ui <- fluidPage( # Application

这个问题更多的是概念性的,而不是明确的,所以我想这次没有玩具代码


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

此应用程序假定全局变量已分配给
窗口。然后,它使用一个自定义消息处理程序来创建原始变量(#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-handler2.js代码:

Shiny.addCustomMessageHandler("changeMessage",
  function(message) {
    window.globalVar = window.globalVar-message;
    alert(JSON.stringify(window.globalVar));
  }
);
back-to-shinny.js代码:

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