有人有一个使用包“rim”在 R 中使用内联代码(不是 RMarkdown)运行 maxima 的有效示例吗? 我们目前在建模课中使用 maxima,如果允许学生在 R 中以符号方式探索方程,那就太好了。然后他们可以在 R 中完成所有数值工作(绘图等),但将 maxima 称为分析部分。
感谢您的任何提示!
例如,有些代码可以工作,有些则不能:
library(rim)
myeqn <- maxima.get("solve((1 + r*(1 - x/K))*x = x, x);")
myint <- maxima.get("integrate(1/(1-x), x);")
df <- data.frame(x = seq(0, 1, by = 0.1))
maxima.eval(myint, code = TRUE, envir = df)
mymat <- maxima.get("matrix([0, 1, a], [1, 0, 1], [1, 1, 0]);")
maxima.get("determinant(mymat);") # Doesn't work
maxima.get("determinant(%o12);") # Does work, using the right output line number for mymat
我希望看到更多有关如何在命令行上在 R 和 maxima 之间来回切换的有效示例。
我不知道这是否有帮助,但我想我可以看到问题所在。据我所知,符号
mymat
(例如)仅在接口的 R 侧定义; Maxima 只知道 %o12
变量。
其中一些解决方案可能正在重新发明轮子(该包没有非常彻底地记录......)
如果您在 Maxima 调用中使用冒号运算符,则会在 Maxima 会话中分配持久标签:
mymat <- maxima.get("mymat: matrix([0, 1, a], [1, 0, 1], [1, 1, 0]);")
maxima.get("determinant(mymat);")
您可以通过定义一个“Maxima 赋值”运算符来使这个过程稍微不那么痛苦/更神奇,该运算符既计算 Maxima 中的表达式,又自动将其分配给 R 符号:
"%<-%" <- function(symbol, expr) {
sstring <- deparse(substitute(symbol))
res <- maxima.get(sprintf("%s: %s", sstring, expr))
assign(sstring, res, parent.frame())
return(invisible(res))
}
newmat %<-% "matrix([0, 1, a], [1, 0, 1], [1, 1, 0]);"
maxima.get("determinant(newmat)")
或者(这是我在想出上面更好的想法之前尝试过的),您可以构建一个 R 已知的 Maxima 对象表,并在将它们传递给 Maxima 之前将它们的“%o”名称替换为字符串:
maxima_symbol_tab <- function() {
max_objects <- list()
for (n in ls(.GlobalEnv)) {
if (inherits(obj <- get(n), "maxima")) {
max_objects <- c(max_objects, list(c(name = n, matname = attr(obj, "output.label"))))
}
}
as.data.frame(do.call(rbind, max_objects))
}
mtab <- maxima_symbol_tab()
maxima.sub <- function(string) {
for (i in seq(nrow(mtab))) {
## cat(string, mtab$name[i], mtab$matname[i], "\n")
string <- gsub(mtab$name[i], mtab$matname[i], string, fixed = TRUE)
}
return(string)
}
maxima.get(maxima.sub("determinant(mymat);"))