如何使用 plotmath 将一个表达式放在另一个表达式之上

How to place an expression on top of another expression using plotmath

如果我想生成多行表达式,我可以这样做:

over = 'OVER'
below = 'BELOW'

x_lab_title = bquote(atop(.(over), .(below)))

ggplot(data.frame()) + xlab(x_lab_title)

不过,我想自己制作 overbelow 表达式,例如:

over = expression(X^2)
below = expression(Y^2)

但它不起作用 - 而是呈现空白 space(这是为什么?)。在我的场景中,真实的表达式要复杂得多,是自动生成的,并且在我生成的后续图之间不断变化,因此我不能简单地做:

x_lab_title = bquote(X^2, Y^2)

在这种特殊情况下会起作用,但不适用于 overbelow.

的任何其他值

经过几个小时的反复试验找到了解决方案 - 这对我有用:

atop_string = paste0('bquote(atop(', toString(over), ',', toString(below), '))')
x_lab_title = eval(parse(text=atop_string))

此解决方案首先组装等效代码表示,然后将其解析为表达式。

尽管我自己找到了解决方案,但我仍然很好奇为什么我不能简单地在 atop 中嵌入表达式?

问题在于 R 中的 expression() 实际上更像是表达式的容器。您真正想要的是表达式对象中的语言对象。所以你可以做

over = expression(X^2)
below = expression(Y^2)
x_lab_title = bquote(atop(.(over[[1]]), .(below[[1]])))

或者,更好的是,跳过 expression() 并只使用 quote()

over = quote(X^2)
below = quote(Y^2)
x_lab_title = bquote(atop(.(over), .(below)))