Функция в R для преобразования числа 0-1 в шестнадцатеричный цветовой код, проблема с отсутствием «зеленого»

Я пытаюсь создать функцию, которая преобразует число от 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 и использовать оператор $.

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
25
1

Ответы 1

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

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)
}

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

Другие вопросы по теме