DT в Shiny и R: пользовательское форматирование чисел

У меня есть блестящее приложение, которое отображает таблицу данных с использованием пакета DT. Я хочу иметь возможность форматировать столбцы по своему усмотрению. Например, я хочу, чтобы значение валюты отображалось следующим образом: 1 234,50 евро вместо DT, которое отображает его как 1 234,5 доллара (обратите внимание на изменение символа, положение символа валюты, а также числа после десятичная точка).

MWE выглядит следующим образом:

library(shiny)
library(DT)

shinyApp(
  # UI
  ui = fluidPage(DT::dataTableOutput('tbl')),

  # SERVER
  server = function(input, output) {
    dat <- data.frame(cur = 1234.5, # supposed to be displayed as: 1,234.50€ | Bad! 
                                         # displayed as $1,234.5
                      perc = 0.123456, # 12.34% | Good!
                      num = 1000) # 1,000 | Bad! displayed as 1000

    # render DT
    output$tbl = DT::renderDataTable(
      datatable(dat) %>%
        formatCurrency(c('cur'), "$") %>%
        formatPercentage('perc', 2) %>%
        formatRound('num', digits = 0)
    )
  }
)

Однако он неплохо справляется со своей задачей, но при изменении символа валюты на символ исчезает. При вставке другого символа, такого как «E», этот символ по-прежнему отображается в начале, а не в конце. Кроме того, числовое значение не получает «большую отметку».

Любые идеи?


person David    schedule 16.10.2015    source источник
comment
Для числового вы можете попробовать: formatCurrency('num', currency = "", interval = 3, mark = ",", digits = 0). Для евро formatCurrency(c('cur'), currency = "€", interval = 3, mark = ",", digits = 1). Я не уверен, как сделать это правильно, хотя   -  person Chris    schedule 16.10.2015
comment
formatCurrency-подход к получению 1000 — это хорошо! Однако я до сих пор не вижу знака € для номера валюты. То же самое, если я использую \U20AC вместо , как это предлагается в ?formatCurrency   -  person David    schedule 16.10.2015


Ответы (1)


Вы можете изменить положение символа валюты в файле .js из пакета данных.

Отредактируйте строку функции DTWidget.formatCurrency.

 $(thiz.api().cell(row, col).node()).html(currency + markInterval(d, interval, mark));

просто

 $(thiz.api().cell(row, col).node()).html(markInterval(d, interval, mark) + currency);

в файле DT/htmlwidgets/datatables.js в каталоге ваших библиотек R.

Что касается символа €,

formatCurrency(c('cur'), currency = "\U20AC", interval = 3, mark = ",", digits = 2)

работает для меня, это то, что вы пробовали, и вы не видите никакого символа?

person Sebastian    schedule 20.10.2015
comment
Интересный подход. Мне придется скопировать направление библиотеки на другие машины, если я хочу получить те же результаты, верно? - person David; 21.10.2015
comment
Да, вам придется связать эту библиотеку с каждой машиной, конечно, запускать на сервере только эту библиотеку. Также после каждого обновления пакета DT вам придется корректировать код. Так что это довольно бесполезно, вы можете предложить это команде разработчиков на github.com/rstudio/DT. реализовать опцию в коде r для размещения символа валюты, так как это очень легко настроить, это может быть подхвачено в следующем обновлении. - person Sebastian; 21.10.2015
comment
Что касается последнего решения: когда я набираю shinyApp(ui = fluidPage(DT::dataTableOutput('tbl')), server = function(input, output) {dat <- data.frame(cur = 1234.5) output$tbl = DT::renderDataTable( datatable(dat) %>% formatCurrency(c('cur'), currency = "\U20AC", interval = 3, mark = ",", digits = 2) ) } ), я получаю сообщение об ошибке, что digits является неиспользуемым аргументом... Без аргумента digits я все еще не вижу символ валюты. см. здесь - person David; 21.10.2015
comment
Хм, это довольно странно, ваш код отлично работает на моем компьютере с Windows и сервере Ubuntu. Мои версии пакетов: dplyr_0.4.2 DT_0.1.34shining_0.12.2 с версией R 3.2.2, возможно, вам нужно обновить свои пакеты? (используйте sessionInfo() для проверки загруженных версий) - person Sebastian; 21.10.2015
comment
Я использую R версии 3.2.2, DT_0.1 (последний выпуск CRAN), блестящую 0.12.2 в RStudio 0.99.482 на 64-битной Windows 7 SP1. Язык системы немецкий, поэтому UTF-8 должен работать, особенно знак € - person David; 21.10.2015
comment
Хм, может попробовать версию DT для разработки: devtools::install_github('rstudio/DT') . - person Sebastian; 21.10.2015
comment
До сих пор нет знака €. Я подозреваю, что это как-то связано с моей машиной, а не с R-кодом... Все равно спасибо! - person David; 22.10.2015