我正在尝试使用命名的字符向量来保存自定义调色板,所以我可以说,例如调色板['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来说相当新,似乎我可能会遗漏一些基本的东西。知道这里发生了什么吗?
答案 0 :(得分: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))
如果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),则不行。