Именованные векторы символов и par() на графиках R

Я пытаюсь использовать именованный вектор символов для хранения пользовательской цветовой палитры, поэтому я могу сказать, например. палитра['красный'] вместо повторения «#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, и кажется, что я могу упустить что-то фундаментальное. Есть идеи, что здесь происходит?


person Larry Glenn    schedule 18.10.2012    source источник


Ответы (1)


Используйте 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)

person mnel    schedule 18.10.2012
comment
Хороший ответ с хорошим объяснением на хороший вопрос с хорошим объяснением. Хорошо. - person thelatemail; 19.10.2012
comment
Благодарю вас! Это имеет смысл, и это сработало, и, как я подозревал, ответ действительно дал хорошее представление об основах. - person Larry Glenn; 19.10.2012