2012-07-11 59 views
3

這工作得很好使用表達式(plotmath)上軸中的R

data = c(1,3,2) 
max_y <- max(data) 
plot_colors <- c("blue") 
plot(data, type="l", col=plot_colors[1], ylim=c(0,max_y), axes=FALSE, xlab=expression(e[3])) 
axis(1, at=c(1,2,3), lab=expression(e[1],e[2],e[3]) ) 

但我想從文件中讀取x軸的標籤。我試過如下:

data = c(1,3,2) 
names = vector("expression",3) 
names[1] = "e[1]" 
names[2] = "e[2]" 
names[3] = "e[3]" 
max_y <- max(data) 
plot_colors <- c("blue") 
plot(data, type="l", col=plot_colors[1], ylim=c(0,max_y), axes=FALSE, xlab=expression(e[3])) 
axis(1, at=c(1,2,3), lab=names ) 

我試過的替代品:

axis(1, at=c(1,2,3), lab=substitute(expression(a), list(a="e[1],e[2],e[3]")) ) 

但是這也沒有工作。 有什麼建議嗎?

回答

2

你想要的是?parse

names = c('e[1]', 'e[2]', 'e[3]') 
namesExp = do.call(c, lapply(names, function(x) parse(text = x))) 
plot(c(1,3,2), type='l', col='blue', axes=FALSE, xlab = expression(e[3])) 
axis(3, at=c(1,2,3), lab = names) 
axis(1, at=c(1,2,3), lab = namesExp) 

以上,lapply返回表達式的列表:

> print(lapply(names, function(x) parse(text = x))) 
[[1]] 
expression(e[1]) 
[[2]] 
expression(e[2]) 
[[3]] 
expression(e[3]) 

do.call只是非recusrively unlists它(也可以使用unlist(lapply(names, function(x) parse(text = x)), recursive = F)):

> print(do.call(c, lapply(names, function(x) parse(text = x)))) 
expression(e[1], e[2], e[3]) 
0

這是醜陋的罪惡,但它做你想做的。可能有更好的方法。

data = c(1,3,2) 
max_y <- max(data) 
plot_colors <- c("blue") 
plot(data, type="l", col=plot_colors[1], ylim=c(0,max_y), 
    axes=FALSE, xlab=expression(e[3])) 

labels <- "e[1],e[2],e[3]" 
axis(1, at=c(1,2,3), lab=eval(parse(text=paste("expression(", labels, ")")))) 

讓我們解開這一點:

> paste("expression(", labels, ")") 
[1] "expression(e[1],e[2],e[3])" 

> parse(text=paste("expression(", labels, ")")) 
expression(expression(e[1],e[2],e[3])) 

> eval(parse(text=paste("expression(", labels, ")"))) 
expression(e[1], e[2], e[3]) 

不,你不能只是解析labels,因爲:

> parse(text=labels) 
Error in parse(text = labels) : <text>:1:5: unexpected ',' 
1: e[1], 
    ^

而且eval似乎是剝落的唯一途徑expression正確。這種替代出現工作:

> parse(text=paste("expression(", labels, ")"))[[1]] 
expression(e[1], e[2], e[3]) 

但它們遞過來axis將讓你對長度不匹配了一個莫名其妙的錯誤消息。我什麼都沒有。

+0

啊,你打我回答。 ''parse(text ='e [1]')'起作用,所以輸入一個或多或少的字符向量) – lockedoff 2012-07-11 19:09:59

+0

其實忽略我的評論,但看到我的答案;)你的外表也很好。 – lockedoff 2012-07-11 19:16:11