R中的函数将0-1数字转换为十六进制颜色代码,缺少“绿色”的麻烦

时间:2018-05-02 12:05:51

标签: r function colors

我正在尝试创建一个函数,将0到100之间的数字转换为十六进制颜色,可用于以后的绘图。这些数据适用于以下形式的一系列淡水健康评分:

ID ......... .........指示器短.............分数

1 ..........水质...... WQual .............. 81

2 ..........盆地状况..BC ................. 85

3 ..........水量...... WQuan ........... 66

4 ..........生物多样性.....生物............ ........ 43

要操纵数据,我使用的是包CREATE SYMMETRIC KEY SQLSymKey WITH ALGORITHM = AES_128 ENCRYPTION BY CERTIFICATE SelfSignedCertificate; plyrcolorRamp

以下功能:

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

试图直接调用每个红色,绿色和蓝色列,但它会产生相同的结果,就像尝试将Indicator_colours转换为data.table并使用FHI_scores_2<-plyr::ddply(FHI_scores_1,.(), transform, Score_cols=rgb(.(Indicator_colours[,1], Indicator_colours[,2], Indicator_colours[,3]), maxColorValue=256)) 运算符一样。

任何有关如何解决这个问题的帮助都会非常感激,毫无疑问我错过了一些非常简单的事情。

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案。 首先,我将颜色方案的定义移到了函数

之外
doInBackground

然后我将红色,绿色和蓝色输出附加到原始数据帧并从那里计算出十六进制。

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

如果有人能提供更优雅的解决方案,我将不胜感激。