r - 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\""
解决方案
您显然需要unname
coef() 值:
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 注释和标题,但在我看来它们似乎令人难以置信的复杂。
也可以使用substitute
which 需要指定具有命名元素的列表。
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\""
推荐阅读
- mongodb - 仅将更改的值从表单提交更新到 MongoDB
- azure - Azure Devops 项目——它们来自哪里?如何去除?
- methods - V-for循环方法不直接导致渲染
- php - PHP将数字增加到10位数字10000次得到不准确的结果
- javascript - 从定义的数值生成行并将公式应用于工作表
- python - python google calendar api'NoneType'对象没有属性'authorize'
- angular - NGXS @Select 与状态模型一起使用
- actionscript-3 - indexOf 在actionscript 3中找不到数组上的变量
- java - 在Java中乘以大整数后达到零
- java - JTabbedPane:如何从上到下而不是从下到上排列标签?