R - Форматирование строк с использованием DT

1

У меня есть таблица данных, которую я хочу отобразить в приложении Shiny с различным форматированием чисел по строкам. Я нашел предыдущее решение для пользователя NicE, которое работает, когда все столбцы и строки являются числовыми, смотрите здесь: R Shiny DataTables: форматировать числа не по столбцам, а по строкам

К сожалению, мой первый столбец не числовой, и с моей таблицей вышеуказанное решение дает значения NaN% в первом столбце и не форматирует последующие столбцы. Я уверен, что есть способ решить эту проблему, но я не знаю JavaScript, поэтому я не знаю, как правильно изменить функцию rowCallback.

Вот моя текущая попытка:

library(DT)
dat <- as.data.frame(matrix(c("# respondents",20,35,18,"involvement rate",.85,.8285,.8889,"target",.80,.85,.9),nrow=3,byrow=T))

datatable(dat,options=list(
  rowCallback=JS("function( row, dat, index ) {
                 $('td:eq(0)', row).html(dat[0] % 1 != 0 | dat[0]==0 ? (dat[0]*100).toFixed(1) +'%':dat[0]);
                 $('td:eq(1)', row).html(dat[1] % 1 != 0 | dat[1]==0 ? (dat[1]*100).toFixed(1) +'%':dat[1]);
                 }
                 ")))

Любая помощь приветствуется!

Редактировать: я подумал, так как единственные ожидаемые строки символов будут в первом столбце, я мог бы вместо этого изменить столбец на имена строк:

dat2 <- subset(dat, select = -1)
rname <- as.vector(dat$V1)
row.names(dat2) <- rname

и затем запустите datatable (...) на dat2 вместо dat. Это приводит к тому же значению NaN% для имен строк, но теперь первый фактический столбец правильно отформатирован, но не остальные столбцы.

Теги:
shiny
dt

1 ответ

0

Начните с j=2 когда вы выполните td:eq(j). Это отбрасывает столбец 0 -th (столбец имен строк) и столбец 1 -th. Я также добавляю if(index>0) чтобы отбросить первую строку (индексируется 0 в Javascript). Предварительно создайте фрейм данных с числовыми столбцами.

library(DT)
dat <- data.frame(
  V1 = c("# respondents", "involvement rate", "target"),
  V2 = c(20, 0.85, 0.8),
  V3 = c(35, 0.8285, 0.85),
  V4 = c(18, 0.8889, 0.9)
)

datatable(dat,options=list(
  rowCallback=JS(c(
    "function(row, dat, index) {",
    "  if(index > 0){"[![enter image description here][1]][1],
    "    for(var j=2; j<dat.length; j++){",
    "      $('td:eq('+j+')', row).",
    "        html((dat[j]*100).toFixed(1) + '%');",
    "    }",
    "  }",
    "}"
  ))
))

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню