3

私は一連のプロットの作成を自動化しています。各プロットは化学物質のクラス (金属、PCB など) に基づいています。省略する理由により、プロットの外側に凡例をプロットし、これを行う関数のinset引数に負の値を使用しています (例: )。化学クラスごとに必要な値が異なるため、パッケージを使用してハッシュ テーブルを作成し、各化学クラスに必要な値を格納することを考えました。ただし、これらをハッシュ テーブルに格納するために、値のベクトルを文字列として格納していました (例: "c(-0.2, 0)")。legend()inset = c(-0.2, 0)insethash

ハッシュ テーブルのコードは次のようになります。 legend.hash <- hash(chem.class, c('c(-0.2, 0)', 'c(-0.2, 0)', 'c(-0.25, -0.4)', 'c(-0.25, -0.3)', 'c(-0.2, 0)', 'c(-0.4, -0.2)', 'c(-0.2, 0)', 'c(-0.2, 0)')) wherechem.classは化学クラスのベクトルです。

結果のハッシュテーブルから値を取得することは明らかに文字"c(-0.2, 0)"列です.Rが次のように使用できる関数として解釈するように、このテキスト文字列を変換する方法はありますlegend(..., inset = legend.hash[[chem.class[i]]])か?

または、従来のグラフィックス システムを使用してこれを実装するより良い方法はありますか?

4

3 に答える 3

7

文字列を関数であるかのように実行する古典的な方法は、eval()andを使用することparse()です。

> eval(parse(text="c(-0.2,0)"))
[1] -0.2  0.0

しかし、単純なリストの代わりにハッシュを使用することに固執する理由が本当に不思議です。

 legend.hash <- list(c(-0.2, 0), c(-0.2, 0), c(-0.25, -0.4), c(-0.25, -0.3), 
                 c(-0.2, 0), c(-0.4, -0.2), c(-0.2, 0), c(-0.2, 0))
 names(legend.hash) <- chem.class

特に悪名高い について考えるeval()と、 and のトリッキーなビットやピースをすべて使用せずに、現在使用している正確な構成を使用できます。parse()fortune(106)

> require(fortunes)
> fortune(106)

If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)
于 2012-05-25T16:06:37.603 に答える
1

2 つの数値を含む文字列を数値のベクトルに変換したい場合は、パッケージのstrapply関数の使用を検討してください。gsubfnこのようにして、parse関数とそれに伴うすべての潜在的な頭痛を回避できます。結果的に速くなる可能性もあります。

文字列を数字と区切り文字 (「c」と括弧なし) だけに変更すると、as.numericon を使用するだけで結果strsplitがさらに速くなる可能性があります。

于 2012-05-25T20:29:57.537 に答える
1

負のインセットを使用するよりも、 関数grconvertXと関数を使用して凡例を配置する方がうまくいく場合があります。grconvertY

于 2012-05-25T20:26:33.687 に答える