将数据从js发送到R Shiny变量

时间:2018-01-25 15:48:45

标签: javascript r shiny

我尝试通过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,因为它看起来是空的。我错过了什么?

1 个答案:

答案 0 :(得分:2)

我相信你需要利用shiny:connected事件。您正在等待文档准备就绪,但您还需要等待闪亮准备好。 JavaScript Events in Shiny页面会触及相关事件并提供更多详细信息。

我把一个小例子放在一起。裸Shiny.onInputChange(..)抱怨没有Shiny对象(请参阅浏览器开发人员控制台)和input$missingNULL。但是,等待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)