DT и Shiny: форматирование чисел в таблице данных с фильтрами - PullRequest
0 голосов
/ 18 ноября 2018

У меня блестящее приложение с данными, и я хотел бы сделать 2 вещи:

  1. Я хотел бы добавить фильтры вверху DTOutput
  2. Я бы хотел, чтобы числа в таблице были отформатированы в процентах.

Я могу достичь только одного или другого.Так что, если я использую только фильтры (см. Попытку № 3 в коде), это работает, но я не могу отформатировать числа в процентах.Если я пытаюсь отформатировать числа (см. Attpemts # 1 и # 2 в коде), тогда фильтры исчезают, но числа правильно отформатированы.Я также получаю предупреждающее сообщение в консоли:

"renderDataTable игнорирует ... аргументы, когда expr приводит к объекту с данными»

, который мне мало помогает, так какЯ совсем новичок в Shiny и R.

Я нашел учебники и ответил на вопросы, касающиеся форматирования чисел или фильтрации таблиц, но я явно что-то упускаю ... Если вы можете привести меня к ответу или обнаружить ошибкув коде ниже я был бы благодарен.

Воспроизводимый app.R здесь:

library(shiny)
library(dplyr)
library(DT)

# Define UI 
ui <- fluidPage(
  actionButton("start", "Click to Start") 
  DTOutput('tbl1'),
  DTOutput('tbl2'),
  DTOutput('tbl3')
)

# Define Server
server = function(input, output) {

  #Attempt #1: gives me the formatted numbers but no filter.
  x <- eventReactive(input$start, iris %>% dplyr::filter(Species == "setosa") %>% datatable %>% formatPercentage(2:3, digits=2))
  output$tbl1<-  DT::renderDT(x(), filter="top")


  #Attempt #2: gives me the formatted numbers but no filter.
  y <- eventReactive(input$start, iris %>% dplyr::filter(Species == "setosa"))
  output$tbl2 <-  DT::renderDT(y() %>% datatable %>% formatPercentage(2:3, digits=2), filter="top")


  #Attempt #3: I get the filter, if I don't try to format the numbers
  z <- eventReactive(input$start, iris %>% dplyr::filter(Species == "setosa"))
  output$tbl3 <-  DT::renderDT(z(), filter="top")


}

# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 18 ноября 2018

Похоже, вы забыли использовать функцию datatable() в 3-й попытке. Вот что вам нужно -

library(shiny)
library(dplyr)
library(DT)

# Define UI 
ui <- fluidPage(
  actionButton("start", "Click to Start"),
  DTOutput('tbl3')
)

# Define Server
server = function(input, output) {

  z <- eventReactive(input$start, {
    iris %>% dplyr::filter(Species == "setosa")
  })

  output$tbl3 <-  DT::renderDT({
    datatable(z(), filter="top") %>% 
      formatPercentage(2:3, digits=2)
  })     
}

# Run the application 
shinyApp(ui = ui, server = server)
...