R Shiny dq_render_handsontable Ошибка при добавлении столбцов и попытке изменить ячейки новых столбцов - PullRequest
0 голосов
/ 02 ноября 2019

Я получаю сообщение об ошибке при использовании блестящего dq_render_handsontable, что, по-моему, является ошибкой пакета dq_shiny. Буду признателен, если кто-нибудь может знать какую-либо работу вокруг. Я пытаюсь интерактивно обновить таблицу с помощью кнопки действия («Создать» в приведенном ниже коде). Таблицы, между которыми я пытаюсь переключаться, имеют разное количество столбцов. Все работает вплоть до отображения новой таблицы, то есть, когда я нажимаю «Создать», я вижу новую таблицу с дополнительными столбцами. НО проблема в том, что, как только я пытаюсь отредактировать ячейки фрейма данных с большим количеством столбцов после редактирования первого с меньшим количеством столбцов, появляется следующая ошибка:

Warning: Error in [<-.data.frame: new columns would leave holes after existing columns

Я думаю, что это, безусловно, ошибкаdq_render_handsontable, который не распознает новые столбцы, добавленные в handsontable. Кто-нибудь знает обходной путь? Может быть, обновить таблицу, прежде чем показывать новый фрейм данных с несколькими столбцами?

Я прикрепляю кусок кода, чтобы воспроизвести ошибку:

library(shiny)
library(rhandsontable)
library(dqshiny)
library(rlang)

  ui = fluidPage(


    dq_handsontable_output("InputTable", 9)
    ,
    # actionButton("render", "Render HoT"),
    actionButton("simulationInput_2", "Generate"),
    fluidRow(id="bigRow", class="hidden",
             style="height:100vh;background:#ff8f00;")
  )

  server = function(input, output) {
    hw <- c("Hello", "my", "funny", "world!")
    data1 <- data.frame(A=hw, B=hw[c(2,3,4,1)], C=1:4, D=Sys.Date() - 0:3,
                        A2=hw, B2=hw[c(2,3,4,1)], C2=1:4, D2=Sys.Date() - 1:4,
                       stringsAsFactors = FALSE)
    hw <- c("Hello", "my", "funny", "world!")
    data2 <- data.frame(A=hw, B=hw[c(2,3,4,1)], C=1:4, D=Sys.Date() - 0:3,
                        # A2=NA, B2=NA, C2=NA, D2=NA,
                        stringsAsFactors = FALSE)
    cont = 0


    observeEvent(input$simulationInput_2, {
      cont <<- cont+1
      print(cont)
      if(mod(cont,2)==0){
        data <- data2
      }else{
        data <- data1
      }
      renderInputTable(data)
      render_hot("InputTable")
      })

    renderInputTable <- function(data){
      dq_render_handsontable(
      "InputTable",
                           data, #"rand",
                           # filters = F, #c("S", "T", "R", "R"),
                           filters = rep(NA, ncol(data)),
                           table_param = list(rowHeaders = NULL, selectCallback = TRUE))

    }

    observeEvent(input$random_select, toggle("bigRow"))
    observeEvent(input$render, render_hot("InputTable"))
  }

shinyApp(ui, server)

1 Ответ

0 голосов
/ 07 ноября 2019

Я мог бы решить эту проблему с помощью хитрости, которая переименовывает идентификатор таблицы dq_shiny, который на самом деле является ошибкой dq_render_handsontable:

library(shiny)
library(rhandsontable)
library(dqshiny)
library(rlang)
library(magrittr)
library(data.table)


ui = fluidPage(
  tags$div(id="simulationInputTable_divOutside", style="padding:0px;margin:0px",
           tags$div(id="simulationInputTable_divInside1", style="padding:0px;margin:0px",
                    dq_handsontable_output("InputTable1", 9)),
           tags$div(id="simulationInputTable_divInside2", style="padding:0px;margin:0px",
                    dq_handsontable_output("InputTable2", 9)),
           tags$div(id="simulationInputTable_divInside3", style="padding:0px;margin:0px",
                    dq_handsontable_output("InputTable3", 9))
  )
  ,
  # actionButton("render", "Render HoT"),
  actionButton("simulationInput_2", "Generate"),
  fluidRow(id="bigRow", class="hidden",
           style="height:100vh;background:#ff8f00;")
)
server = function(input, output) {
  columns <- c(1,2,3,4)
  hw <- c("Hello", "my", "funny", "world!")

  cont = 0
  observeEvent(input$simulationInput_2, {
    cont <<- cont+1
    data1 <- data.frame(A=hw, B=hw[c(2,3,4,1)], C=1:4, D=Sys.Date() - 0:3,
                        A2=hw, B2=hw[c(2,3,4,1)], C2=1:4, D2=Sys.Date() - 1:4,
                        stringsAsFactors = FALSE)
    name = paste0("InputTable",cont)
    divName = paste0("simulationInputTable_divInside",cont-1)
    hide(divName)
    dq_render_handsontable(
      name,
      data1, #"rand",
      # filters = F, #c("S", "T", "R", "R"),
      filters = rep(NA, ncol(data1)),
      table_param = list(rowHeaders = NULL, selectCallback = TRUE))
  })
  observeEvent(input$random_select, toggle("bigRow"))
  observeEvent(input$render, render_hot("InputTable"))
}
shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...