Как обновить datatable с помощью formatStyle через dataTableProxy - PullRequest
2 голосов
/ 26 сентября 2019

Я пытаюсь обновить backgroundColor столбца, используя dataTableProxy.Однако я не уверен, как правильно обрабатывать имена столбцов.Вот пример:

library(shiny)
library(DT)

ui <- fluidPage(
   fluidRow(
       DT::dataTableOutput("myplot")
    )
)

server <- function(input, output) {

    output$myplot <- DT::renderDataTable({
        datatable(as.data.frame(rnorm(5))) %>%
            formatStyle(1, backgroundColor = 'red')
    })

    proxy <- DT::dataTableProxy("myplot")
    mycolors <- c("red", "green", "blue")

    observe({
        invalidateLater(1000)

        proxy %>% replaceData(as.data.frame(rnorm(5)))

        # proxy %>% replaceData(as.data.frame(rnorm(5))) %>%
        #     formatStyle(1, backgroundColor = sample(mycolors, 1))
    })
}


shinyApp(ui = ui, server = server)

Несмотря на то, что числа обновляются, как я и ожидал, я не могу заставить работать formatStyle (закомментированный код).Он продолжает показывать следующую ошибку:

Warning: Error in !: invalid argument type
  56: name2int

И вот ошибка, которую я получаю, используя "rnorm(5)" в качестве столбца при вызове formatStyle.

Warning: Error in name2int: You specified the columns: rnorm(5), but the column names of the data are 
  57: stop

Как правильно ссылаться на столбцы при использовании dataTableProxy?

1 Ответ

1 голос
/ 26 сентября 2019

Проблема здесь не в именах столбцов.formatStyle не принимает прокси-объект в качестве аргумента, он ожидает табличный объект, созданный из datatable().

См. ?dataTableProxy для функций, доступных для манипулирования существующими экземплярами с возможностью датирования.Соответственно, вы не можете напрямую изменить цвет фона с помощью dataTableProxy.

Однако одной из функций, доступных для работы с прокси-объектами, является replaceData(), которую вы используете выше.Кроме того, formatStyle дает нам возможность установить цвет фона на основе данных, доступных в таблице .

Соответственно, вы можете создать вспомогательный столбец (и динамически изменить его), содержащий информациюв качестве цвета фона спрячьте его и скажите formatStyle, чтобы изменить цвет в соответствии с этим столбцом.

Вот рабочий пример:

library(shiny)
library(DT)

ui <- fluidPage(
  fluidRow(
    DT::dataTableOutput("myplot")
  )
)

server <- function(input, output) {

  mycolors <- c("red", "green", "blue")

  output$myplot <- DT::renderDataTable({
    DF <- data.frame(replicate(5, sample(rnorm(5), 10, rep = TRUE)), "background_color" = sample(mycolors, 1))
    HideCols <- which(names(DF) %in% c("background_color"))
    datatable(DF, options = list(columnDefs = list(list(visible=FALSE, targets=HideCols)))) %>% formatStyle(
      "background_color",
      target = "row",
      backgroundColor = styleEqual(levels = mycolors, values = mycolors)
    )
  })

  proxy <- DT::dataTableProxy("myplot")

  observe({
    invalidateLater(1000)
    DF <- data.frame(replicate(5, sample(rnorm(5), 10, rep = TRUE)), "background_color" = sample(mycolors, 1))
    proxy %>% replaceData(DF)
  })
}

shinyApp(ui = ui, server = server)

Result

Для получения дополнительной информации см. this .

...