2016-07-26 54 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