4

我正在尝试使用命名字符向量来保存自定义调色板,所以我可以说,例如调色板['red'],而不是到处重复“#dc322f”。

但是,我似乎无法使用该向量的元素作为参数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

1 回答 1

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'])

在此处输入图像描述

至于为什么?

在 内par,如果所有参数都是字符向量,则

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

as.list(unlist(args))如果 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,则不会)

于 2012-10-18T22:31:39.877 回答