我正在自动创建一系列图表,每个图表都基于一类化学品(例如金属,PCB等); 由于我将遗漏的原因,我正在绘制情节之外的图例,并使用负值来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)'))
where chem.class是化学类的向量.
从结果哈希表中检索值显然是一个字符串"c(-0.2, 0)",是否有一种转换此文本字符串的方法,以便R将其解释为可以像下面这样使用的函数:legend(..., inset = legend.hash[[chem.class[i]]])?
或者有没有更好的方法来使用传统的图形系统实现这一点?
执行字符串的经典方式就像它是一个函数一样是使用eval()和parse():
> eval(parse(text="c(-0.2,0)"))
[1] -0.2 0.0
Run Code Online (Sandbox Code Playgroud)
但我真的好奇为什么你坚持使用哈希而不是简单的列表.
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
Run Code Online (Sandbox Code Playgroud)
将允许你使用你现在正在使用的确切构造,没有所有棘手的部分eval()和parse(),特别是考虑臭名昭着fortune(106):
> require(fortunes)
> fortune(106)
If the answer is parse() you should usually rethink the question.
-- Thomas Lumley
R-help (February 2005)
Run Code Online (Sandbox Code Playgroud)