bquote:如何包含保存为字符串对象的表达式?

时间:2014-06-09 23:07:14

标签: string r expression

我的目标是使用最佳拟合线的斜率来标注绘图,并标记斜率的单位,其中标签将另存为单独的字符串对象。我无法弄清楚如何让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命令中的一个简单的语法问题吗? 谢谢你的任何建议!

2 个答案:

答案 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

在任何一种情况下,我们都会得到:

screenshot

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返回的表达式中,并且这似乎不能很好地工作。