You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript发送GET请求结果无法传入R Shiny的input$myinfo求助

解决Shiny中JavaScript传递数据到input$myinfo为空的问题

我帮你梳理几个可能导致input$myinfo始终为空的原因,以及对应的解决办法:

1. 错误读取了响应数据格式

你在done回调里使用data.responseJSON是个误区——jQuery的$.ajax在请求成功且响应是JSON格式时,data参数本身就是已经解析好的JSON对象,并不存在responseJSON这个属性(这个属性是原生XMLHttpRequest或Fetch API里的)。你现在相当于把undefined传给了Shiny.onInputChange,自然导致input$myinfo为空。

修正这部分代码:

.done(data => { 
  // 如果Shiny端需要字符串格式的JSON,就用JSON.stringify
  Shiny.onInputChange('myinfo', JSON.stringify(data)); 
  // 要是想让Shiny直接接收成R的列表/数据框,也可以直接传对象:Shiny.onInputChange('myinfo', data);
})

2. 没有等Shiny完成连接就发送请求

你的代码在DOM就绪后立刻执行,但此时Shiny可能还没和后端服务器建立好连接,这时候调用Shiny.onInputChange无法正确把数据同步到Shiny的input系统里。建议把请求逻辑放到Shiny连接完成的事件回调中:

修改后的完整JavaScript代码:

$(document).on('shiny:connected', function() { 
  $.ajax({ 
    method : "GET", 
    url : window.location.origin + "/mypath",
    dataType: "json" // 显式指定数据类型,确保jQuery自动解析JSON响应
  }) 
  .done(data => { 
    console.log("请求成功,返回数据:", data); // 加日志方便调试看数据
    Shiny.onInputChange('myinfo', data); 
  }) 
  .fail(data => { 
    console.log("请求失败详情:", data.responseText); 
  }); 
});

3. 先确认请求本身是否正常

你可以打开浏览器开发者工具的Network标签页,检查这个GET请求的状态:

  • 看看请求的URL是否正确,有没有出现404错误
  • 查看响应内容是否是你预期的JSON格式
  • 确认响应头的Content-Type是否为application/json(如果不是,jQuery不会自动解析,这时候需要手动用JSON.parse(data)来解析响应文本)

另外还要注意:你是否在Shiny后端配置了/mypath这个端点?比如有没有用shiny::addResourcePath或者设置对应的路由来处理这个GET请求?如果端点不存在,请求会直接进入fail回调,你可以通过console里的日志看到错误信息。

内容的提问来源于stack exchange,提问作者vladli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:09:21