2016-07-26 57 views
3

我想在下面的示例中使用上标作为标签。不过,我不想把代码他们,我希望他们去到3 ^水平,其中水平是一个常数R:以编程方式生成带上标的图轴中断标签(以编程方式强调)

library(ggplot2) 

LEVELS = 4 

mylabels = c(
    expression(paste(3^4,"= 81")), 
    expression(paste(3^3,"= 27")), 
    expression(paste(3^2,"= 9")), 
    expression(paste(3^1,"= 3")), 
    expression(paste(3^0,"= 1"))) 
mylabels 
length(mylabels) 


df=data.frame(x=runif(40),y=(runif(40)*10)%%5) 
p = ggplot(df,aes(x,y)) + 
    geom_point() + 
    scale_y_continuous(breaks = 0:LEVELS, labels = mylabels) 
p 

硬编码verison完美的作品。但我似乎无法以编程方式获得它。以下内容:

mylabels=c(paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep="")) 

在图表中未正确评估(例如,它在标签中写入“表达式”等词语)。它创建:

[1] "expression(paste(3^4,\" = 81\"))" "expression(paste(3^3,\" = 27\"))" "expression(paste(3^2,\" = 9\"))" 
[4] "expression(paste(3^1,\" = 3\"))" "expression(paste(3^0,\" = 1\"))" 

和我要的是:

expression(paste(3^4, "= 81"), paste(3^3, "= 27"), paste(3^2, 
"= 9"), paste(3^1, "= 3"), paste(3^0, "= 1")) 

搞砸有关与崩溃,noquote,EVAL,sprintf的,等

回答

3

需要构建表达载体为首先使用字符向量,然后使用parse()对其进行解析,该向量返回与输入字符向量对应的表达式向量。建筑特征向量最好用sprintf()完成:

mylabels <- parse(text=sprintf('paste(3^%d,\' = %d\')',LEVELS:0,3^(LEVELS:0))); 
mylabels; 
## expression(paste(3^4,' = 81'), paste(3^3,' = 27'), paste(3^2,' = 9'), 
##  paste(3^1,' = 3'), paste(3^0,' = 1')) 

plot


其他提示:

1:当提供取决于随机数生成的代码示例,请致电set.seed()在产生任何随机性之前。

2:expression()函数是可变参数,并返回一个表达式向量,其元素对应于输入参数。因此,你可以用

expression(
    paste(3^4,"= 81"), 
    paste(3^3,"= 27"), 
    paste(3^2,"= 9"), 
    paste(3^1,"= 3"), 
    paste(3^0,"= 1") 
) 

3更换

c(
    expression(paste(3^4,"= 81")), 
    expression(paste(3^3,"= 27")), 
    expression(paste(3^2,"= 9")), 
    expression(paste(3^1,"= 3")), 
    expression(paste(3^0,"= 1")) 
) 

避免重复调用c()。你可以用

paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep="") 
+1

PLUS1做得好..我是浪费了太多的时间在这个替代

c(paste("expression(paste(3^",LEVELS:0,'," = ',3^(LEVELS:0),'"))',sep="")) 

。 (似乎你可以简化它'mylabels < - parse(text = sprintf('3 ^%d ==%d',LEVELS:0,3 ^(LEVELS:0)))',但我不知道这是否会来back and bite – user20650

+1

@ user20650优秀的一点,你的简化在这里工作唯一的警告是,如果'3 ^%d'右边的标签不是有效的R语法,那么它将不起作用,因为'parse()'不能将它解析成一个有效的R解析树,但是由于在这种情况下它是有效的语法,所以它可以工作。 – bgoldst