【发布时间】:2018-02-06 17:09:12
【问题描述】:
这个问题是概念性的,而不是针对特定代码的明确问题,所以我想这次没有玩具代码。
我有一个相当大的闪亮应用程序,它使用了一些 d3.js 脚本。 D3 对象在调用它们的update 函数时访问一些全局变量。我想从 Shiny 服务器控制这些变量 - 这可能吗?
【问题讨论】:
标签: d3.js shiny shiny-server htmlwidgets
这个问题是概念性的,而不是针对特定代码的明确问题,所以我想这次没有玩具代码。
我有一个相当大的闪亮应用程序,它使用了一些 d3.js 脚本。 D3 对象在调用它们的update 函数时访问一些全局变量。我想从 Shiny 服务器控制这些变量 - 这可能吗?
【问题讨论】:
标签: d3.js shiny shiny-server htmlwidgets
此应用假定全局变量已分配给 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);
【讨论】: