我尝试通过javascript发送get请求并将响应发送到input$myinfo
。当我启动应用程序时,我可以在开发工具的Sources
标签中看到该文件,但似乎它无效。
以下是我的js文件的外观:
$(() => {
$.ajax({
method : "GET",
url : window.location.origin + "/mypath"
})
.done(data => {
Shiny.onInputChange('myinfo', JSON.stringify(data.responseJSON));
})
.fail(data => {
console.log(data.responseText);
});
});
然后加载到ui.R
并且(据我所知)在app的启动时运行。但它似乎永远不会到input$myinfo
,因为它看起来是空的。我错过了什么?
答案 0 :(得分:2)
我相信你需要利用shiny:connected
事件。您正在等待文档准备就绪,但您还需要等待闪亮准备好。 JavaScript Events in Shiny页面会触及相关事件并提供更多详细信息。
我把一个小例子放在一起。裸Shiny.onInputChange(..)
抱怨没有Shiny
对象(请参阅浏览器开发人员控制台)和input$missing
是NULL
。但是,等待Shiny.onInputChange(..)
事件的shiny:connected
会通过,input$found
为"[1,2,3,4,5]"
。
library(shiny)
on_ready <- paste(
"$(function() {",
"$(document).on('shiny:connected', function(e) {",
"Shiny.onInputChange('found', JSON.stringify([1, 2, 3, 4, 5]));",
"});",
"Shiny.onInputChange('missing', JSON.stringify(['where', 'am', 'I?']));",
"",
"});",
sep = "\n"
)
ui <- fluidPage(
tags$head(
tags$script(on_ready)
),
fluidRow(
column(
6,
h5("`input$missing`:"),
verbatimTextOutput("missingValue"),
p("(error, Shiny object is missing as connection is not yet established)")
),
column(
6,
h5("`input$found`:"),
verbatimTextOutput("foundValue"),
p("(no error, wait for `shiny:connected` event)")
)
)
)
server <- function(input, output) {
output$missingValue <- renderPrint({
input$missing
})
output$foundValue <- renderPrint({
input$found
})
}
shinyApp(ui, server)