我的目标是使用最佳拟合线的斜率来标注绘图,并标记斜率的单位,其中标签将另存为单独的字符串对象。我无法弄清楚如何让bquote()
将字符串对象转换为表达式,并将其与其他评估语句结合起来。
示范:
# example data:
x <- c(1:20) # x units: time
y <- x * rnorm(20, 10, 2) # y units: length per time
unit.label <- "L%.%T^-2" # label for slope of best fit line
lm1 <- summary(lm(y ~ x))
plot(y ~ x)
当我尝试为绘图添加注释时会出现问题。我可以得到bquote()来显示斜率:
text(median(x), min(y), bquote(slope: .(round(lm1$coefficients[2], 2))) )
我也可以bquote()
显示斜率的单位:
plot(y ~ x)
text(median(x), min(y), bquote(.(parse(text = unit.label))) )
但我无法将标签和斜率合并为一个bquote()
语句:
plot(y ~ x)
text(median(x), min(y), bquote(slope: .(round(lm1$coefficients[2], 2))
.(parse(text = unit.label))) )
# Error: unexpected symbol in "text(median(x), min(y), bquote(slope:
# .(round(lm1$coefficients[2], 2)) ."
使用paste()
,单位标签与斜率一起显示,但标签不会被读作表达式:
plot(y ~ x)
text(median(x), min(y), bquote(slope: .(paste(round(lm1$coefficients[2], 2),
as.expression(unit.label))))
)
我哪里错了?这是我的bquote命令中的一个简单的语法问题吗? 谢谢你的任何建议!
答案 0 :(得分:4)
1)解析char字符串创建所需的字符串(确保它表示在R中语法上有效的表达式),然后解析它。这里main_s
是字符串:
fm <- lm(y ~ x)
main_s <- paste("slope:", round(coef(fm)[2], 2), "~", unit.label)
plot(0, main = parse(text = main_s))
语句设置main_s
可以替换为以下sprintf
语句,该语句可以说更具可读性:
main_s <- sprintf("slope: %.2f ~ %s", coef(fm)[2], unit.label)
2)bquote 以上可能是处理此问题的最直接的方法,但要使用bquote
试试这里unit.label_c
是一个调用对象{{1如上所定义:
fm
在任何一种情况下,我们都会得到:
UPODATE 已添加(2)。还有一些改进和更正。
答案 1 :(得分:4)
我喜欢先使用substitute
构建表达式,并且永远不要将表达式的某些部分存储为字符向量。这将有效
plotlabel = substitute( slope~L%.%T^-2,
list(slope=round(lm1$coefficients[2], 2)))
plot(y ~ x)
text(median(x), min(y), plotlabel)
但至于为什么bquote
不起作用是一个有趣的问题。显然,您尝试替换的两种类型的对象是不同的类。在斜率值的情况下,这是一个基本字符,在unit.label的情况下,你正在调用parse,它返回一个表达式。对我而言,将表达式放入bquote
似乎很棘手。奇怪的是,它本身就能发挥作用。
bquote(.(parse(text = unit.label))) #works -> expresion
bquote(.(parse(text = unit.label))+1) #doesn't work -> call
前者返回“表达式”,后者返回“调用”。我们真的希望第二个也能返回一个表达式,但是它试图将“+1”添加到已经由parse返回的表达式中,并且这似乎不能很好地工作。