2012-10-18 13 views
4

我試圖使用命名字符向量來保存自定義調色板,所以我可以說,例如,調色板['紅'],而不是重複「#dc322f」到處。命名字符向量和Par()在R圖

但是,我似乎無法將該向量的元素用作par()的參數(儘管它可以在別處使用)。

下面是一個例子。它會創建一個帶有綠點的圖形,但par()調用失敗,背景爲白色。需要注意的是使用從plot()調用中的調色板矢量我可以設定參數:

> palette <- c('#002b36','#dc322f','#859900') 
> names(palette) <- c('black','red','green') 
> par(bg=palette['red'])                                 
Warning message: 
In par(bg = palette["red"]) : "bg.red" is not a graphical parameter 
> plot(1:10,1:10,col=palette['green']) 
> # (White graph with green dots appears) 

當我使用名爲數字載體,然而,它的工作原理:

> palette <- 1:3                                   
> names(palette) <- c('black','red','green')                            
> par(bg=palette['red'])                                
> # (no error here -- it worked.) 
> plot(1:10,1:10,col=palette['green']) 
> # (Red graph with green dots appears) 

我相當新的R,似乎我可能會失去一些根本性的東西。任何想法發生了什麼?

回答

4

使用unname,這樣傳遞給par的項目僅僅是定義顏色的特徵向量,而不是一個命名元素

palette <- c('#002b36','#dc322f','#859900') 
names(palette) <- c('black','red','green') 
par(bg=unname(palette['red'])) 
plot(1:10,1:10,col=palette['green']) 

enter image description here

至於爲什麼?

par,如果所有的參數都是特徵向量然後

if (all(unlist(lapply(args, is.character)))) 
      args <- as.list(unlist(args)) 

的方式as.list(unlist(args))作品,如果參數表是一個命名字符向量是

args <- list(bg = palette['red']) 
as.list(unlist(args)) 
$bg.red 
[1] "#dc322f" 

bg.red不是有效par

如果行是像

setNames(as.list(unlist(args, use.names = F)), names(args)) 

,那麼它可能在某些情況下工作(雖然不是如有的arg命名元素有長度> 1)

+0

一個很好的答案有一個很好的解釋對一個很好的問題有一個很好的解釋。好。 – thelatemail

+0

謝謝!這是非常有道理的,而且它很有用,而且,正如我懷疑的那樣,答案的確提供了對基本面的良好洞察力。 –