在 R 中使用符号代码“maxima”的内联代码示例(通过包“rim”)

问题描述 投票:0回答:1

有人有一个使用包“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 之间来回切换的有效示例。

r symbolic-math maxima
1个回答
0
投票

我不知道这是否有帮助,但我想我可以看到问题所在。据我所知,符号

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);"))
© www.soinside.com 2019 - 2024. All rights reserved.