Функция в R для преобразования 0-1 в шестнадцатеричный код цвета, проблема с отсутствующим "зеленым" - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать функцию, которая преобразует число от 0 до 100 в шестнадцатеричный цвет, который можно использовать для последующего построения. Данные приведены для ряда показателей здоровья пресной воды в форме:

ID ......... индикатор ......... Short ............. оценка

1 .......... Качество воды .... WQual .............. 81

2 .......... Состояние бассейна .. BC ................. 85

3 .......... Количество воды ... WQuan ........... 66

4 .......... Биоразнообразие ..... Био ............ ........ 43

Для манипулирования данными я использую пакеты plyr, colorRamp и data.frame.

Функция ниже:

FHI_col<-function(x, Col_ramp, Indicator_colours){
  ##first I need to convert each score to fit the colorRamp
  FHI_scores_1<-plyr::ddply(x,.(Score), transform,
                            Score_1 = 1-(Score/100))
  ##define the colorscheme using the colorRamp package
  Col_ramp<-colorRamp(matlab.like2(800))

  ##convert the scores into red, green and blue
  Indicator_colours<-Col_ramp(FHI_scores_1$Score_1)

  ## convert red, green, blue colors into hexidecimal format and add to dataframe
  ## this is where it goes wrong! 
  FHI_scores_2<-plyr::ddply(FHI_scores_1,.(), transform,
                            Score_cols=rgb(.(Indicator_colours), maxColorValue=256))

  ##additional tidying up for export
  FHI_scores_3 <- as.data.table(FHI_scores_2)
  FHI_scores_4 <-FHI_scores_3[Score==0, Score_cols := "grey60"]
  FHI_scores_5 <- FHI_scores_4[order(ID),]
  return(FHI_scores_5)
}

Когда я запускаю функцию для набора данных указанного типа, я получаю сообщение об ошибке

Error in rgb(.(Indicator_colours: 
  argument "green" is missing, with no default

Если я запускаю тот же код, что и отдельные команды, я получаю желаемый результат. Однако попытка связать их вместе в функции приводит к этой ошибке. Если Indicator_colours находится вне функции, значит, она работает!

Я пробовал различные варианты оскорбительной строки, такие как:

FHI_scores_2<-plyr::ddply(FHI_scores_1,.(), transform,
                         Score_cols=rgb(.(Indicator_colours[,1], Indicator_colours[,2],
                       Indicator_colours[,3]), maxColorValue=256))

в попытке напрямую вызвать каждый красный, зеленый и синий столбец, но он дает тот же результат, что и попытка преобразовать Indicator_colours в таблицу data.table с использованием оператора $.

Любая помощь в том, как это исправить, будет принята с благодарностью, без сомнения, я упускаю что-то довольно простое.

1 Ответ

0 голосов
/ 04 мая 2018

Я придумала и решение. Сначала я переместил определение цветовой схемы за пределы функции

Col_ramp<-colorRamp(matlab.like2(800))

Затем я добавил красный, зеленый и синий цвета к исходному кадру данных и вычислил шестнадцатеричное значение оттуда.

 FHI_col<-function(x){
  FHI_scores_1<-plyr::ddply(x,.(Score), transform,
                    Score_1 = 1-(Score/100))
  FHI_scores_2<-ddply(FHI_scores_1,.(Score_1), transform,
            Score_cols=Col_ramp(Score_1))

  FHI_scores_3<-ddply(FHI_scores_2,.(Score_cols.1, Score_cols.2, Score_cols.3), transform,
            Score_colour=rgb(Score_cols.1, Score_cols.2, Score_cols.3, maxColorValue=256))

  FHI_scores_4 <- as.data.table(FHI_scores_3)
  FHI_scores_5 <-FHI_scores_4[Score==0, Score_colour := "grey60"]
  FHI_scores_6 <- FHI_scores_5[order(ID),]
  return(FHI_scores_6)
}

Если кто-нибудь может предложить более элегантное решение, я был бы признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...