styleColorBar Центрировать и сдвигать влево/вправо в зависимости от знака

Я хочу создать полосы, которые при использовании DT datatable появляются в середине ячеек столбца и выходят влево или вправо в зависимости от того, является ли значение в ячейке положительным или отрицательным.

Я попытался использовать функцию styleColorBar и изменить аргумент backgroundPosition на 'left' или 'center', однако с каждой попыткой полосы по-прежнему появляются справа от ячейки и всегда идут влево.

Я не могу найти пример из кода R, но приложил пример того, что можно сделать в Excel; цвета не нужны, но если они включены, это будет бонусом.

введите описание изображения здесь


person Ashley Baldry    schedule 04.11.2015    source источник
comment
Это интересный вопрос, но ему не хватает усилий в том виде, в котором он представлен. Пожалуйста, добавьте воспроизводимый пример. Вы можете добавить минимальный пример, где вы использовали backgroundPosition = 'left', чтобы люди могли использовать его и попытаться найти решение. Очень маловероятно, что кто-то (включая меня) потратит время на написание кода, создающего описанную здесь ситуацию, а затем попытается найти решение...   -  person LyzandeR    schedule 04.11.2015
comment
Я понимаю, что то, что я написал, было нелегко понять; переписали, так читается лучше. Вероятно, все еще не здорово, но, надеюсь, имеет больше смысла, чем раньше!   -  person Ashley Baldry    schedule 04.11.2015


Ответы (1)


Вы можете создать пользовательскую функцию styleColorBar, которая использует градиенты CSS (такие же, как исходная styleColorBar), чтобы создавать нужные вам полосы.

Вот пример (извините за длинную строку, добавление новых строк ломает CSS):

color_from_middle <- function (data, color1,color2) 
{
  max_val=max(abs(data))
  JS(sprintf("isNaN(parseFloat(value)) || value < 0 ? 'linear-gradient(90deg, transparent, transparent ' + (50 + value/%s * 50) + '%%, %s ' + (50 + value/%s * 50) + '%%,%s  50%%,transparent 50%%)': 'linear-gradient(90deg, transparent, transparent 50%%, %s 50%%, %s ' + (50 + value/%s * 50) + '%%, transparent ' + (50 + value/%s * 50) + '%%)'",
             max_val,color1,max_val,color1,color2,color2,max_val,max_val))
} 

Используя некоторые тестовые данные:

data <- data.frame(a=c(rep("a",9)),value=c(-4,-3,-2,-1,0,1,2,3,4))

datatable(data) %>%
  formatStyle('value',
              background=color_from_middle(data$value,'red','blue'))

введите описание изображения здесь

person NicE    schedule 04.11.2015
comment
Большое спасибо, отлично сработало даже для нескольких столбцов! - person Ashley Baldry; 04.11.2015
comment
Привет @NiceE, мне просто интересно, знаете ли вы, как сделать то же самое в пакете gt. Подробнее см. здесь мой вопрос SO stackoverflow.com/questions/64442840/ - person Jakub.Novotny; 20.10.2020