2012-05-25 91 views
2

我自動創建了一系列基於一類化學品(如金屬,多氯聯苯等)的圖表;出於原因,我將忽略掉,我將圖例繪製在繪圖之外,並使用legend()函數的inset參數的負值來完成此操作(例如,inset = c(-0.2, 0))。由於每個化學類別對inset都要求不同的值,所以我想用hash包創建一個哈希表來存儲每個化學類所需的值。然而,爲了將這些存儲在散列表中,我將值的向量存儲爲一個字符串(例如「c(-0.2,0)」)。在R中顯示一個字符串作爲函數R

我對哈希表的代碼如下所示: 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)')) 其中chem.class是化工類的載體。

從得到的哈希表中檢索值顯然是字符串,有沒有一種方法可以轉換這個文本字符串,以便R將它解釋爲可以像下面這樣使用的函數:legend(..., inset = legend.hash[[chem.class[i]]])

或者有沒有更好的方式來實現這一點使用傳統的圖形系統?

+2

爲什麼你不能簡單地使用一個列表? – joran

+0

我很想看到一個例子,你*真的需要多個插值來繪製圖例。這可能比這更簡單。 – baptiste

+0

圖例中的項目數量和項目長度在整個系列圖中顯着變化(範圍從1到超過40個項目)。保持每個小區的插圖相同,導致圖例延伸超過頁邊距。 – sinclairjesse

回答

6

執行字符串,如果它是一個功能的經典方法是使用eval()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()parse()件,特別是考慮臭名昭著fortune(106)

> require(fortunes) 
> fortune(106) 

If the answer is parse() you should usually rethink the question. 
    -- Thomas Lumley 
     R-help (February 2005) 
+0

完美。說實話,列表的實用程序有時會逃脫我。很明顯,我需要花更多的時間與他們在一起。謝謝!另外 - 感謝您的額外智慧:) – sinclairjesse

+0

只是爲了跟進,會不會僅僅爲了提高速度而在列表中使用哈希表? – sinclairjesse

+0

對於這個大小的例子,我希望散列表的速度差異可以忽略不計(除非你正在執行操作數百萬次),並可能(?)由於需要'eval(parse())'將字符串恢復爲適當的數字矢量格式而被完全否定...... –

1

它可能工作最好使用grconvertXgrconvertY函數來定位圖例,而不是使用負插入。

+0

這是一個答案或評論...? –

+0

這意味着作爲對原始問題中最後一行的回答,表明存在定位圖例比轉換字符串更好的方法。 –

1

如果您確實想將其中包含2個數字值的字符串轉換爲數字向量,請考慮使用gsubfn軟件包中的strapply函數。這樣可以避免parse函數及其伴隨的所有潛在問題。它也可能最終變得更快。

如果你改變了字符串只是數字和一個分隔符(不帶「c」和括號),那麼你可以只使用as.numeric上的strsplit其結果可能會更快。