如何通过JuliaConnectoR在Julia中调用R定义的函数并集成QuadGK?
使用JuliaConnectoR将R函数与Julia的QuadGK集成
问题背景
我尝试用R包JuliaConnectoR把R中定义的Runge函数和Julia的QuadGK积分模块结合,编写了以下代码:
library(JuliaConnectoR) juliaSetupOk() ## [1] TRUE fRunge <- function(x) 1/(1 + (5*x)^2) # 定义Runge函数 jRunge <- juliaPut(fRunge) # 创建R端的代理函数对象
但尝试用juliaCall("jRunge", 1.0)或juliaEval("jRunge(1.0)")调用时,均提示Julia中未定义jRunge变量:
juliaEval("jRunge(1.0)") ## Error: Evaluation in Julia failed. ## Original Julia error message: ## LoadError: UndefVarError: `jRunge` not defined
此前用JuliaCall时,通过julia_assign("jlRunge", fRunge)绑定变量名后能正常调用并完成积分:
library(JuliaCall) julia_setup() julia_assign("jlRunge", fRunge) julia_eval("jlRunge([-1.0, -0.5, 0, 0.5, 1.0])") ## [1] 0.03846154 0.13793103 1.00000000 0.13793103 0.03846154 julia_library("QuadGK") julia_command("I, err = quadgk(jlRunge, -1, 1);") julia_eval("[I, err]") ## [1] 5.493603e-01 1.058539e-09
但最新版JuliaCall无法在R 4.3.0+和Julia 1.9.0+环境下正常运行,因此需要改用JuliaConnectoR实现需求。
解决方案
JuliaConnectoR的juliaPut()仅创建R端的代理对象,不会自动在Julia环境中生成同名变量,这是和JuliaCall的核心差异。以下是两种正确调用方式及QuadGK集成步骤:
方式1:直接通过R代理对象调用函数
无需在Julia环境中绑定变量,直接将代理对象传入juliaCall()即可:
# 计算单个值 juliaCall(jRunge, 1.0) ## [1] 0.03846154 # 计算多个值 juliaCall(jRunge, c(-1.0, -0.5, 0, 0.5, 1.0)) ## [1] 0.03846154 0.13793103 1.00000000 0.13793103 0.03846154
方式2:在Julia环境中绑定变量名
如果需要在Julia代码中用变量名直接调用,使用JuliaConnectoR的juliaAssign()函数将代理对象绑定到Julia变量:
# 将R代理对象绑定到Julia的jlRunge变量 juliaAssign("jlRunge", jRunge) # 用juliaEval调用函数 juliaEval("jlRunge(1.0)") ## [1] 0.03846154
集成QuadGK完成积分
方法A:绑定变量后调用QuadGK
# 加载QuadGK模块 juliaEval("using QuadGK") # 执行积分并获取结果 result <- juliaEval("quadgk(jlRunge, -1, 1)") I <- result[[1]] # 积分值 err <- result[[2]] # 误差估计 c(I, err) ## [1] 5.493603e-01 1.058539e-09
方法B:直接用代理对象调用quadgk
无需提前绑定变量,直接将代理函数传入juliaCall():
# 加载QuadGK模块 juliaEval("using QuadGK") # 直接调用quadgk result <- juliaCall("quadgk", jRunge, -1, 1) c(result[[1]], result[[2]]) ## [1] 5.493603e-01 1.058539e-09
内容的提问来源于stack exchange,提问作者Hans W.
相关产品推荐
相关产品推荐

