【问题标题】:How to modify a js variable within a shiny server (htmlwidgets/R)如何在闪亮的服务器中修改 js 变量 (htmlwidgets/R)
【发布时间】:2018-02-06 17:09:12
【问题描述】:

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

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

【问题讨论】:

    标签: d3.js shiny shiny-server htmlwidgets


    【解决方案1】:

    此应用假定全局变量已分配给 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-to-shiny.js 代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 2014-05-06
      • 2016-11-04
      • 2016-11-15
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多