R传奇变量替换

时间:2017-09-27 15:10:47

标签: r variables legend substitution

我总是希望我的R代码尽可能灵活;目前我有三条(可能更多)曲线可以根据参数增量进行比较,但我不想在任何地方对delta值进行硬编码(如果可以避免,也可以修改多少值)。

我正在尝试创建一个涉及希腊语和变量替换delta值的图例,因此每个图例条目的形式类似于'delta = 0.01',其中delta是希腊语,0.01是由变量确定的。已尝试过pastesubstitutebquoteexpression的许多不同组合,但最终会在完成的图例中留下一些逐字代码,或者无法放置' delta'成为象征形式。

delta <- c(0.01,0.05,0.1)
plot(type="n", x=1:5, y=1:5) #the curves themselves are irrelevant
legend_text <- vector(length=length(delta)) #I don't think lists work either
for(i in 1:length(delta)){
  legend_text[i] <- substitute(paste(delta,"=",D),list(D=delta[i]) )
}
legend(x="topleft", fill=rainbow(length(delta)), legend=legend_text)

由于legend=substitute(paste(delta,"=",D),list(D=delta[1])适用于单个条目,我还尝试了一个“半硬编码”版本,修复了delta的长度:

legend(x="topleft", fill=rainbow(length(delta)),
       legend=c(substitute(paste(delta,"=",A), list(A=delta[1])),
                substitute(paste(delta,"=",B), list(B=delta[2])),
                substitute(paste(delta,"=",C), list(C=delta[3])) )
      )

但这与以前的问题相同。

有没有办法可以做到这一点,或者我是否需要每次更新delta时手动更改代码?

1 个答案:

答案 0 :(得分:1)

尝试将lapply()as.expression()一起使用以生成图例标签。还可以使用bquote创建单个表达式

legend_text <- as.expression(lapply(delta, function(d) {
    bquote(delta==.(d))
} ))

请注意,使用plotmath,您需要==才能获得等号。也不需要paste()因为这里没有任何字符串。