使用带有变量 r 的表达式

问题描述 投票:0回答:5

我正在尝试使用以下标签来标记绘图:

“Some Assay EC50 (uM)”,其中“u”是微符号。

我目前有:

assay <- "Some Assay"
plot(0,xlab=expression(paste(assay," AC50 (",mu,"M)",sep="")))

但这给出:“测定 EC50 (uM)”而不是所需的“某些测定 EC50 (uM)”。

建议?谢谢。

我也尝试过:

paste(assay,expression(paste(" AC50 (",mu,"M)",sep="")),sep="")
r expression
5个回答
67
投票

您想要

bquote()
和一点绘图数学的组合:

assay <- "Some Assay"
xlab <- bquote(.(assay) ~ AC50 ~ (mu*M))
plot(0, xlab = xlab)

~
是一个间距运算符,
*
表示将内容并列在运算符的左侧和右侧。在
bquote()
中,任何包含在
.( )
中的内容都将被查找并替换为命名对象的值;因此表达式中的
.(assay)
将被替换为
Some Assay


9
投票

使用 tidy_eval 方法你可以做

library(rlang)

assay <- "Some Assay"
plot(0,xlab=expr(paste(!!assay," AC50 (",mu,"M)",sep="")))

expr 和 !!包含在 tidyverse 中,因此您实际上不需要加载 rlang。我把它放在那里只是为了明确它们来自哪里。


2
投票

使用

mtext
和 bquote

的另一个选项
plot(0,xlab='')
Lines <- list(bquote(paste(assay," AC50 (",mu,"M)",sep="")))
mtext(do.call(expression, Lines),side=1,line=3)

请注意,我在第一个图中将 xlab 设置为 null。

编辑 无需调用表达式,因为 bquote 将创建一个表达式,并用其值替换 .( ) 中包含的元素。所以一个好的答案是:

plot(0,xlab='')
Lines <- bquote(paste(.(assay)," AC50 (",mu,"M)",sep=""))
mtext(Lines,side=1,line=3)

1
投票

你也可以尝试穷人的方法:

assay <- "Some Assay"
plot(0, xlab = paste0(assay, " AC50 (µM)"))

它直接指定 mu 字符,而不是使用表达式(

paste0
只是
paste
sep = ""
)。


0
投票

expression()
替换为
eval()
+
parse()
在包含字符串变量时有效。

请注意,所有空格都必须替换为

~
,因此在下面的
gsub
变量上调用
assay
。我已经替换了标签其余部分中的空格(例如
" AC50 (mu*M)"
-->
"~AC50~(mu*M)"

assay <- "Some Assay"
plot(0,xlab=eval(parse(text = paste0(gsub(' ', '~', assay),"~AC50~(mu*M)"))))
© www.soinside.com 2019 - 2024. All rights reserved.