如果要生成多行表达式,可以执行以下操作:
over = 'OVER'
below = 'BELOW'
x_lab_title = bquote(atop(.(over), .(below)))
ggplot(data.frame()) + xlab(x_lab_title)
但是,我想自己制作over
和below
表达式,例如:
over = expression(X^2)
below = expression(Y^2)
但是它不起作用-而是呈现空白(为什么?)。在我的场景中,实际表达式要复杂得多,自动生成,并且在我生成的后续图之间进行更改,因此我不能简单地这样做:
x_lab_title = bquote(X^2, Y^2)
在这种情况下可以使用,但不适用于over
和below
的任何其他值。
答案 0 :(得分:3)
问题在于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)))
答案 1 :(得分:0)
经过数小时的反复试验,找到了解决方案-这对我有用:
atop_string = paste0('bquote(atop(', toString(over), ',', toString(below), '))')
x_lab_title = eval(parse(text=atop_string))
此解决方案首先组装等效的代码表示形式,然后将其解析为表达式。
即使我自己找到了解决方案,我仍然好奇为什么不能简单地将表达式嵌入atop
中?