Как создать настраиваемый столбец (с возможностью сортировки) в DT :: datatable - PullRequest
1 голос
/ 08 мая 2020

Допустим, у меня есть ниже data-table -

    library(DT)
     d = data.frame(
      names = rownames(mtcars),
      date = as.Date('2015-03-23') + 1:32,
      time = as.POSIXct('2015-03-23 12:00:00', tz = 'UTC') + (1:32) * 5000,
      stringsAsFactors = FALSE
    )

    datatable(d, filter = 'bottom', options = list(pageLength = 5))

Теперь я хочу создать новый столбец в data-table, объединив date+time+some-other-string как date_time. Этот новый столбец date_time следует сортировать только по части date (а не по части time и не по части string). Я также хочу задать другой цвет для date части и time части.

Есть ли способ добиться этого?

Любой указатель будет очень признателен.

1 Ответ

2 голосов
/ 08 мая 2020

Чтобы отсортировать четвертый столбец в соответствии со вторым столбцом:

library(DT)

render <- JS(
  "function(data, type, row, meta){",
  "  if(type === 'sort' || type === 'type'){",
  "    return row[2];",
  "  } else {",
  "    return data;",
  "  }",
  "}"
)

d = data.frame(
  names = rownames(mtcars),
  date = as.Date('2015-03-23') + 1:32,
  time = as.POSIXct('2015-03-23 12:00:00', tz = 'UTC') + (1:32) * 5000,
  otherColumn = mtcars$mpg,
  stringsAsFactors = FALSE
)

datatable(d, filter = 'bottom', 
          options = list(
            pageLength = 5,
            columnDefs = list(
              list(targets = 4, render = render)
            )
          )
)

Для цветов вы можете:

render <- JS(
  "function(data, type, row, meta){",
  "  if(type === 'sort' || type === 'type'){",
  "    return row[2];",
  "  } else if(type === 'display'){",
  "    var date = '<span style=\"color:red;\">' + row[2] + ' </span>';",
  "    var time = '<span style=\"color:blue;\">' + row[3] + ' </span>';",
  "    var other = '<span style=\"color:green;\">' + data + '</span>';",
  "    return date + time + other;",
  "  } else {",
  "    return data;",
  "  }",
  "}"
)

d = data.frame(
  names = rownames(mtcars),
  date = as.Date('2015-03-23') + 1:32,
  time = as.POSIXct('2015-03-23 12:00:00', tz = 'UTC') + (1:32) * 5000,
  otherColumn = stringi::stri_rand_strings(32, 3),
  stringsAsFactors = FALSE
)

datatable(d, filter = 'bottom', 
          options = list(
            pageLength = 5,
            columnDefs = list(
              list(targets = 4, render = render)
            )
          )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...