aardio 文档

aardio 范例: + R 语言 (Shiny)+ WebView2 界面

//aardio 调用 R 语言 - Web 交互界面
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio + R 语言 (Shiny)+ WebView2 界面";right=759;bottom=469)
winform.add()
/*}}*/

import process.r;
import wsock.tcp.server;

//安装 R 包,如果已安装忽略不操作
process.r.require("shiny");

//R 代码 
var rCode = `
library(shiny)
library(jsonlite)

ui <- fluidPage(
  titlePanel("JavaScript in Shiny"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("numPoints",
                  "点的数量:",
                  min = 10,
                  max = 100,
                  value = 30),
      actionButton("genPlot", "生成图表")
    ),
    mainPanel(
      plotOutput("distPlot"),

      # 在HTML页面中插入JavaScript代码
      tags$script(HTML("

        Shiny.addCustomMessageHandler('sendJsonData',async function(data) {

            //调用 aardio 函数
            var ret = await aardio.nativeMsgbox(data);

            window.myJsonData = data;  // 存储数据供JavaScript使用
        });

        $(document).on('shiny:inputchanged', function(event) { 
          if (event.name === 'genPlot' && event.value > 0) { 
            //Shiny.onInputChange('jsData', JSON.stringify(window.myJsonData)); 
          }
        }); 
      "))
    )
  )
)

server <- function(input, output, session) {
  data <- reactive({
    data.frame(x = rnorm(input$numPoints), y = rnorm(input$numPoints))
  })

  output$distPlot <- renderPlot({
    req(input$genPlot > 0)
    plot(data()$x, data()$y, main = "随机分布图")
  })

  observeEvent(input$genPlot, {
    jsonData <- toJSON(data(),dataframe="values")
    session$sendCustomMessage(type = 'sendJsonData', message = jsonData)
  })
}

# 获取空闲端口
args<-commandArgs(T)
port<-as.integer(args[1])

# 运行 Shiny 应用
shinyApp(ui = ui, server = server, options = list(port = port, host = '127.0.0.1'))
`; //可以添加不定个数的启动参数


//启动 R,分配空闲端口(安全、不会相互冲突)
var port = wsock.tcp.server.getFreePort('127.0.0.1');
var r = process.r.start(rCode,port);
//r.logResponse( );

import web.view;
var wb = web.view(winform);

//导出 aardio 函数,可在网页上调用以下函数
wb.external = {
    nativeMsgbox = function(obj){ 
        winform.msgbox( obj )
    } 
}

wb.go("http://127.0.0.1:"+port);

winform.show(3/*_SW_MAXIMIZE*/);
win.loopMessage();
Markdown 格式