Я пытаюсь создать функцию, которая преобразует число от 0 до 100 в шестнадцатеричный цвет, который можно использовать для последующего построения. Эти данные относятся к ряду показателей здоровья пресной воды в форме:
ID ......... Индикатор ......... Краткое ............. Оценка
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 и использовать оператор $
.
Мы будем очень благодарны за любую помощь в том, как это исправить, без сомнения, мне не хватает чего-то довольно простого.
Я придумал и решение. Сначала я переместил определение цветовой схемы за пределы функции
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)
}
Если кто-то может предложить более элегантное решение, я был бы признателен.