3

我正在自动创建一系列地块,每个地块都基于一类化学品(例如金属、多氯联苯等);出于我将省略的原因,我将图例绘制在绘图之外,并使用负值作为函数的inset参数legend()来执行此操作(例如,inset = c(-0.2, 0))。由于每个化学类别都需要不同的值,因此inset我想使用该hash包创建一个哈希表来存储每个化学类别所需的值。但是,为了将这些存储在哈希表中,我将值向量存储为字符串(例如,“c(-0.2, 0)”)。

我的哈希表代码如下所示: 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

grconvertX使用andgrconvertY函数而不是使用负插图来定位您的图例可能会更好。

于 2012-05-25T20:26:33.687 回答
1

如果您真的想将其中包含 2 个数值的字符串转换为数字向量,请考虑使用包中的strapply函数gsubfn。这样,您就可以避免该parse功能以及随之而来的所有潜在问题。它也可能最终变得更快。

如果您将字符串更改为仅数字和分隔符(没有“c”和括号),那么您可以只使用as.numeric其结果strsplit可能会更快。

于 2012-05-25T20:29:57.537 回答