r - 在 Julia_Eval 中为 diffeqr 求解器评估字符串
问题描述
我正在尝试使用 R 脚本中的 for 循环评估字符串JuliaCall::julia_eval
。虽然我能够使用该deSolve
包在 R 中完成此操作,但在将代码转换为与 Julia 兼容的代码时遇到了问题。正确运行的 R deSolve 代码的基本代码如下所示。
library(deSolve)
library(dplyr)
Combine <- c(" - 1*0.4545*(H2O2^1) - 1*27000000*(`$OH`^1)*(H2O2^1)", " - 1*3100000000*(`1,4-dioxane`^1)*(`$OH`^1)",
" - 1*33000*(TOC^1)*(`$OH`^1)", "2*0.4545*(H2O2^1) - 1*3100000000*(`1,4-dioxane`^1)*(`$OH`^1) - 1*33000*(TOC^1)*(`$OH`^1) - 1*27000000*(`$OH`^1)*(H2O2^1) - 1*8500000*(`$OH`^1)*(`HCO3-`^1) - 1*390000000*(`$OH`^1)*(`CO3 2-`^1)",
" - 1*8500000*(`$OH`^1)*(`HCO3-`^1)", " - 1*390000000*(`$OH`^1)*(`CO3 2-`^1)"
)
time <- seq(from=0, to=0.01, by = 1E-4)
State <- c(H2O2 = 0.000294117647058824, `1,4-dioxane` = 0.00000113494,
TOC = 0, `$OH` = 0, `HCO3-` = 0.003766104, `CO3 2-` = 0.0000167638711956647)
ODEcreater2 <- function(t, state, parameters){
with(as.list(c(state)),{
for (i in 1:6) { #
dY[i] <- eval(parse(text=Combine[i]))}
return(list(dY))
} )}
out1<- ode(y = state, times = time, func = ODEcreater2, parms = NULL)
我正在尝试使用复制代码并在 Julia 中运行它,以通过使用diffeqr
vs.来提高 ODE 求解器的速度deSolve
。不幸的是,我正在评估 for 循环中的字符串/表达式julia_call
。
library(diffeqr)
diffeqr::diffeq_setup()
library(JuliaCall)
julia <- julia_setup()
ODEcreater <- JuliaCall::julia_eval("
function (dY,t,state)
for i in 1:6
dY[i] = eval(Meta.parse(:Combine[i]))
end
end")
tspan <- list(1E-6, 1E-3)
sol = diffeqr::ode.solve(ODEcreater,state,tspan, abstol=1e-8, reltol=1e-8)
有没有人了解评估 for 循环中字符串的最佳方法?我一直在研究 JuliaLang 网站上的元表达式,但仍然迷路。
解决方案
如重复问题https://stackoverflow.com/a/58766919/1544203中所述,构建字符串然后执行
sprintf("function f(du,u,p,t)\n%s\nend", paste(Combine, collapse="\n"))
从 R 端构建一个与有效格式匹配的字符串。这也是最佳的,因为它从生成的函数中排除了任何额外的函数调用。
推荐阅读
- javascript - Cheerio - 无法获得元素的孩子
- javascript - Chart.js 如何在图表中仅显示最后 10 个点
- php - 如何只显示一次评论,但在 PHP 中显示来自 mysql 的所有图像?
- python - 如果从熊猫数据框列值中删除一个句子,则删除第一个单词
- android - 滚动时不会隐藏 RecyclerView 上的透明工具栏
- sql-server-2016 - 将 JSON 列转换为字符串
- php - PHP项目登录问题
- angular - Angular 6 - http 获取请求响应映射到对象
- html - 联系表格文本区域进入和滚动
- javascript - 比较 React refs 以设置类名