网站首页 > 教程文章 正文
aardio 已大幅改进对 R 语言的支持,下面直接看代码。
复制粘贴下面的代码到 aardio 编辑器就可以运行。所有关于 R 语言的事情与准备工作 aardio 会全自动化处理。
一、aardio 调用 R 函数
//调用 R 函数
import process.r;
//定义 R 语言函数
var rCode = /*
add <- function(a,b) {
result <- a + b
print(result)
}
*/
//启动 R 语言
var r = process.r.startRpc(rCode);
//调用 R 函数
var ret = r.add(2,3);
//获取返回值
ret = ret[["result"]];
就这么简单两个编程语言就可以方便地交互了。
二、 R 语言 + aardio 窗口绘图
用 aardio 画界面绘图,R 语言生成图像。
先看流畅的动画效果:
实现上面效果的 aardio + R 代码也非常简单:
import win.ui;
/*DSG{{*/
var winform = win.form(text="R 在 aardio 窗口上绘图")
winform.add(
button={cls="button";text="点这里调用 R 绘图";left=472;top=414;right=680;bottom=456;z=2};
plus={cls="plus";left=18;top=15;right=739;bottom=397;bgcolor=16777215;z=1}
)
/*}}*/
//R 语言代码
var rCode = /*
draw_sine_wave <- function(filename, phase_shift = 0, amplitude = 1) {
png(filename, width = 800, height = 600)
x <- seq(0, 2 * pi, length.out = 1000)
y <- amplitude * sin(x + phase_shift)
# 绘制图形
plot(x, y, type = "l", col = "blue", lwd = 2,
main = paste("Dynamic Sine Wave, Amplitude:", round(amplitude, 2)),
xlab = "X Axis", ylab = "Y Axis",
xlim = c(0, 2 * pi), ylim = c(-2, 2))
# 关闭设备
dev.off()
new_phase_shift <- phase_shift + pi / 20
new_amplitude <- 1 + sin(phase_shift)
return(list(phase_shift = new_phase_shift, amplitude = new_amplitude))
}
*/
//启动 R
import process.r;
var r = process.r.startRpc(rCode);
//按钮点击事件
winform.button.oncommand = function(id,event){
//设置绘图初始变量
var params = {
phase_shift = 0;
amplitude = 1
}
//创建定时器
winform.setInterval(
function(){
//调用 R 函数
params,err = r.draw_sine_wave(io.fullpath("/test2.png"), params.phase_shift,params.amplitude)
//取 R 函数返回值
params = params.result;
//显示图像,先读取到内存,不占用文件,让 R 函数可以自由写文件。
winform.plus.background = string.load("/test2.png");
},80
)
//启动按钮动画
winform.button.disabledText = {"";"";"";"";"";""}
}
winform.show();
win.loopMessage();
三、 R 语言(Shiny)+ aardio + WebView2 网页交互界面
强大的 WebView2 其实也可以用于 R 语言。
用 R 语言方便地控制网页绘图与交互,也可以在绘图交互界面用 JavaScript 直接调用 aardio 函数。
先看效果:
R 绘图很强,这里只是演示基本的路子。
下面看实现代码:
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio + R 语言 (Shiny)+ WebView2 界面")
/*}}*/
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);
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();
四、aardio / R 传递、接收命令行参数
import console.int;
import process.r;
var out = process.r.exec(`
#这样接收参数,R.utils 包也有一个 commandArgs 可以解析命名参数
args <- commandArgs(T);
cat( args[1] )
`,"测试一下");
//可以添加不定个数的启动参数或表参数
//aardio 中 string.args 支持的格式都可以用在这里
console.log( out );
五、aardio / R 通过 JSON 交换对象
import console.int;
import process.r;
//安装 R 包,如果已安装忽略不操作
process.r.require("jsonlite")
//如果返回值为 JSON,则自动解析 JSON 并返回对象。
var obj = process.r.json( `
library("jsonlite") # 载入 jsonlite 包
args <- commandArgs(T);
tab <- fromJSON(args[1], simplifyVector=FALSE);
#不要用 print ,cat 不会加一堆不必要的东西
cat( toJSON(tab,auto_unbox=TRUE) )
`, {
name1 = "测试一下,传对象给 R 语言";
name2 = "这是一个 aardio 对象"
})
//输出 R 返回的对象
console.dumpJson(obj);
这里有一个细节要注意一下。
JSON 里的普通字符串,给 R 解析一下 JSON 再生成 JSON 就会变成 [ "字符串" ] 这样的数组。
这是因为 R 里面单个值是原子向量,相当于别的语言里长度为 1 的数组。
而 jsonlite 提供了一个 unbox 函数可以处理这个事,一个个的写 unbox(x) 并不容易,但其实 JSON 是一个很动态的东西。经常同一个对象他可能是数值,也可能是字符串,也可能是数组,但 unbox 如果用到非原子值上就会报错,所以最简单的方法是这样写:
toJSON(tab,auto_unbox=TRUE) )
很多事情,只要不追求完美,解决也就容易了。
六、嵌入 aardio 模板
aardio 本身提供语言级别的模板语法。
其实这东西很有趣,有点像用 PHP 写 HTML。例如 R 代码中间就可以用 <? ?> 插 aardio 代码进去,动态的控制输出与执行什么样的 R 代码。
模板语法并不复杂,具体可以看文档。
下面看一个简单的例子:
//嵌入模板
import console.int;
import process.r;
//执行 R 代码,支持模板语法:
var prcs = process.r.loadcode(`write("<?
//可以在 R 代码中嵌入 aardio 代码
if(_WIN10_LATER){
print("新系统",owner.模板参数名)
}
else {
print("旧系统",owner.模板参数名)
}
?>",file=".data.txt");`,{
模板参数名 = "参数值"
})
prcs.logResponse();
- 上一篇: Python中定义函数
- 下一篇: Python语言入门源代码
猜你喜欢
- 2025-01-21 Python中的“锁”艺术:解锁Lock与RLock的秘密
- 2025-01-21 Python格式化字符串
- 2025-01-21 Lua实现文件I/O操作,你会吗?
- 2025-01-21 Python调用易语言动态链接库,实现验证码通杀例子
- 2025-01-21 Python语言入门源代码
- 2025-01-21 Python中定义函数
- 2025-01-21 Python基础语法之print和变量赋值
- 2025-01-21 java程序设计练习题(二)附答案
- 2025-01-21 c#中使用miniExcel和fastreport实现付款审批单的批量打印
- 2025-01-21 R语言实战—自学笔记—向量
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)