首页 > 解决方案 > R 替代函数将 c() 连接到方程中

问题描述

我有一个像魅力一样工作的旧功能:

lm_eqn = function(m) {
    
    l <- list(a = format(coef(m)[1], digits = 2),
    b = format(abs(coef(m)[2]), digits = 2),
    r2 = format(summary(m)$r.squared, digits = 3));
    
        eq <- substitute(italic(C)[i] == a + b %.% italic(I)[i]*","~~italic(r)^2~"="~r2,l)
  
    
    as.character(as.expression(eq));
}

其中 m 是一个 lm 模型。这将产生如下等式:

y = 0.3 + 4.4x,r = 0.67

然后可以在 ggplot 中使用它来显示模型公式及其图形。问题是同一个方程现在包含了未调用的符号:

y = c(0.3) + c(4.4)x, r=0.67

现在,我正在累积的列表中的每个变量都包含连接的 c() - 我不知道为什么。有谁知道如何

a) 防止这种情况,或 b) 纠正它?

注意:问题似乎是替代出现的,eq 的输出是:

"italic(y) == c(`(Intercept)` = \"0.3\") + c(x = \"4.4\") %.% italic(x) * \",\" ~ ~italic(r)^2 ~ \"=\" ~ \"0.67\""

看起来替代的输出包括截距和斜率的 c()。

编辑

在这种情况下,m 是一个通用的 lm 元素。例如

x <- c(5,3,6,8,2,6)
y <- c(2,6,3,7,4,9)
test.lm <- lm(y~x)

lm_eqn(test.lm)
[1] "italic(C)[i] == c(`(Intercept)` = \"3.3\") + c(x = \"0.37\") %.% italic(I)[i] * \",\" ~ ~italic(r)^2 ~ \"=\" ~ \"0.0969\""

标签: r

解决方案


您显然需要unnamecoef() 值:

lm_eqn = function(m) {

    l <- list(a = format(unname(coef(m))[1], digits = 2),
               b = format(abs(unname(coef(m))[2]), digits = 2),
               r2 = format(summary(m)$r.squared, digits = 3));
        eq <- bquote( italic(C)[i] == .(l$a) + .(l$b) %.% italic(I)[i]*","~~italic(r)^2~"="~.(l$r2))
        as.character(as.expression(eq));
}

我还认为您需要准确说明您希望看到的内容。目前,您正在创建一个包含两个元素的表达式向量,然后将其转换为字符。它的“表达式”需要字符值这一事实ggplot使得查看字符值并弄清楚将显示什么变得非常困难,因此您可能应该扩展您的测试代码以包含传递该值的方式。(查看真正的 R 表达式要容易得多。)我认为有一些机制允许将未计算的表达式传递给 ggplot 注释和标题,但在我看来它们似乎令人难以置信的复杂。

也可以使用substitutewhich 需要指定具有命名元素的列表。

lm_eqn = function(m) {

    l <- list(a = format(unname(coef(m))[1], digits = 2),
               b = format(abs(unname(coef(m))[2]), digits = 2),
               r2 = format(summary(m)$r.squared, digits = 3));
        eq <- substitute( italic(C)[i] == a + b %.% italic(I)[i]*","~~italic(r)^2 == r2, env=l) )
        as.character(as.expression(eq));
}

lm_eqn(test.lm)
[1] "italic(C)[i] == \"3.3\" + \"0.37\" %.% italic(I)[i] * \",\" ~ ~italic(r)^2 == \"0.0969\""

推荐阅读