Shiny APP 嵌入示例
Shiny APP通过IFRAME嵌入网页的方案非常灵活,可以嵌入任何现存的传统WEB界面应用系统,从而扩充系统的功能,集成深度数据分析与展示的能力,盘活存量的软硬件与数据资产。但Shiny APP与嵌入的网页窗口之间要能够通过javascript在程序的层面互相操作(流程与数据),实现真正的集成连通,嵌入才有意义。浏览器有同源规则的安全限制,不同源的网页之间不能互相操作。Shiny APP与宿主网页一般是不同源的,即协议+域名+端口三项一般不完全一致,这里通过HTML5引入的跨文档通信 API(Cross-document messaging)来解决,这个API为window对象新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源。
传入的参数可以用于为Shiny APP设定初始的运行状态,传出的参数可以向调用者报告APP运行的状态或结果,从而实现与嵌入环境的集成。
本示例先按《传入》按钮传入数据给嵌入的Shiny APP,记录调用的父窗口,然后才可以按《传出》按钮传出数据给父窗口。
通过Shiny.setInputValue(id, data)通知Shiny服务器端input变量的更新事件,Shiny的reactive与observe机制会被触发更新所有相关的变量与状态,但浏览器端的可视化控件,比如本例的sliderInput等,是JS 的C3控件,不会自动更新,要由服务器端通知浏览器去更新,通过在observeEvent()中调用updateSliderInput(session, id, value = data)来完成。父窗口的页面源码包含了发消息给IFRAME中Shiny APP的javascript,可以在浏览器中查看页面的源码。
mtcars示例 |
返回 |
|