2012-11-01 9 views
8

プロットタイトル、軸ラベル、凡例などを生成するために、ラテン文字とギリシャ文字のベクトルをマージしたいと思います。以下の例。私はギリシャ文字を元の形で描く方法を理解できません。私はexpressionparseapplypasteコマンドに組み合わせて試してみましたが、単一の式の場合にはラテン/ギリシア語の混在したテキストを容易に生成するコードをベクトル化できませんでした(例:expression("A ("*alpha*")")単一の表現の)。R:プロットタイトル、軸ラベル、または凡例用のラテン/ギリシャ式のベクトルを作成する

data<-matrix(seq(20),nrow=5,ncol=4,byrow=TRUE) 
colnames(data)<-c("A","B","C","D") 
greek<-c(" (alpha)"," (beta)"," (gamma)"," (delta)") 
matplot(data) 
legend(1,max(data),fill=c("black","red","green","blue"),apply(matrix(paste(colnames(data),greek,sep=""),nrow=4,ncol=1),1,expression)) 

あなたはlegend()ステートメント内apply()文で私を助けていただけますか?所望の出力(すなわち、A(α)、B(β)、C(γ)、D(δ))を生成するために何らかの修正が必要である。前もって感謝します。

答えて

7

ここparse()を避ける代替だし、@のmnelの素敵な答えにあなたの最初のコメントで述べた例で動作します:あなたの非常用

greek <- c("alpha", "beta", "gamma", "delta") 
cnames <- paste(LETTERS[1:4], letters[1:4]) 

legend_expressions <- 
sapply(1:4, function(i) { 
    as.expression(substitute(A (B), 
        list(A = as.name(cnames[i]), B = as.name(greek[i])))) 
}) 

matplot(data) 
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions) 

enter image description here

+0

ありがとう、ジョシュ。あなたのソリューションは、さまざまな入力に対して非常に堅牢です。 'A(B)'、 'A * B'、' A〜B'が 'substitute'ステートメントで動作するのに対し、' A B'はなぜ動作しないのか説明できますか?また、新しいユーザーのために 'as.'構文が必要な理由についてコメントできますか?私は 'substitute'が評価されていない式を返すので、' as.expression'で 'substitute'の出力に作用するのが意味があると読んでいます。 'as.name'はどうですか? – user001

+1

@ user001 - あなたがよく知っているように、「R言語」の[このセクション](http://cran.r-project.org/doc/manuals/R-lang.html#Computing-on-the-language)定義は、Rの言語要素とそれを操作する方法について傾いている良い出発点です。 'substitute()'は最初の引数として構文的に有効な文を取ることができます。 'A B'は構文的に有効なので"許可され​​ていません "。 (あなたは、そのフォームを持つコマンドラインでタイプされたRステートメントについて考えることはできますか?私は思っていませんでした!)。 –

+1

@ user001 - 'substitute()'は*一般的にクラス "式"のオブジェクトを返しません。 ( '?substitute'の" Value "セクションを見て、' class(s​​ubstitute()) 'で遊んでみてください。私はas.expression()を使用して、式オブジェクトに返すものを強制的に*強制します。式はベクトル型であるため、 'sapply()'は複数のlength-1式を1つの長さ-4の式ベクトルに連結するだけです。 'as.name()'について知るには '?as.name'を参照してください。お役に立てれば! –

3

apply式のベクトルを作成しないでください。

代わりにparse(text = ...)を使用してください。

.expressions <- paste(colnames(data),greek,sep="") 
legend_expressions <-parse(text = .expressions) 

matplot(data) 
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions) 

enter image description here

あなたは、式の中~を含める場合。あなたの現在のワークフローを考えると、それもあなたの発現ベクターになります文字列を形成するためにsprintfを使用するように明確であるかもしれないpaste

.expressions <- paste(colnames(data),greek,sep="~") 
legend_expressions <-parse(text = .expressions) 

matplot(data) 
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions) 

enter image description here

に呼び出し内でsep = '~'sep = ''を交換するのが最も簡単と思われます。

スペースを含む文字列を含める場合は、これらの文字列を文字列内の引用符で囲む必要があります。例えば。

greek <- c("alpha", "beta", "gamma", "delta") 
other_stuff <- c('hello world','again this','and again','hello') 

.expressions <- mapply(sprintf, colnames(data), other_stuff, greek, 
         MoreArgs = list(fmt = '"%s %s"~(%s)')) 

.expressions 
##       A       B       C       D 
## "\"A hello world\"~(alpha)" "\"B again this\"~(beta)" "\"C and again\"~(gamma)"  "\"D hello\"~(delta)" 

legend_expressions <-parse(text = .expressions) 

matplot(data) 
legend(1,max(data),fill=c("black","red","green","blue"),legend_expressions) 

enter image description here

+0

感謝役に立つ解決策。 '〜'文字を明示的に使用せずにラベルにスペースを組み込む方法を教えてください。例えば、 'c(" A〜a "、" B〜b "、" C〜c "、" D〜d ")'に再定義することは許されます。 "、" B b "、" C c "、" D d ")'はありません(後者の定義は 'parse'文の実行時に'予期しないシンボル 'エラーを出します)。おそらく、私が列名にチルダ文字を必要としない場合は、文字列置換関数を使用して、すべてのスペースをチルダで 'parse'ステートメントの前に置き換える必要があります。 – user001

+1

私の編集を参照してください...... – mnel

+0

ありがとう@mnel。私は 'colnames'に空白を入れたいと思っています(例えば、" A "ではなく" A a ")。ただし、 'colnames'にスペースが含まれていると' parse'文が失敗します。スペースがチルダ(例えば、 "A a"ではなく "A〜a")に置き換えられた場合、 'parse'ステートメントは失敗しなくなりました。 'paste 'の' sep'として '〜'を使うことは、 '' a' 'のようなスペースを持つ 'colname'ではまだ動作しません。 – user001

関連する問題