В R Shiny, как вы сбрасываете данные (отменяя все ручные вводы) в rhandsontable с помощью кнопки действия?

#r #shiny #modal-dialog #rhandsontable

Вопрос:

В приведенном ниже коде MWE кнопка действия «показать» запускает модальное диалоговое окно с таблицей, которой пользователь может управлять с помощью rhandsontable. Работает по назначению, за исключением того, что кнопка «сброс» не работает. Сброс должен отменить все вводимые пользователем данные в таблицу и вернуть таблицу случайных величин с 2 столбцами и 5 строками.

Как мне сбросить таблицу? Я дурачился с этим сегодня утром, но пока безуспешно.

Кстати, это должно оставаться в модальдиалоге! Rhandsontable в модальном диалоговом окне кажется сложным, но чрезвычайно функциональным для этой модели со многими входными данными.

Смотрите изображения внизу. На первом изображении показано, что происходит при первом вызове приложения и нажатии кнопки «Показать». Хорошо — появится таблица из 5 строк и 2 столбцов. Второе изображение — это то, что отображается после того, как пользователь щелкает правой кнопкой мыши по таблице, чтобы вставить дополнительную строку внизу, введя 6 в столбцы x и y 6-й строки. Если вы нажмете «Отклонить» модальный и снова нажмете «Показать», хорошо-появится та же измененная таблица, как и предполагалось. Многократное нажатие кнопки Отклонить/Показать возвращает ту же самую измененную таблицу из 6 строк-хорошо! Но если вы нажмете «Сброс», измененная таблица с 6-й добавленной строкой будет возвращаться. Следует вернуться к таблице из 5 строк. Если пользователь вручную ввел в таблицу много строк, а не только одну дополнительную строку, как в этом примере, сброс должен вернуть таблицу из 5 строк.

 library(shiny)
library(rhandsontable)

ui <- fluidPage(actionButton("show","Show"), 
                actionButton("reset","Reset"))

server <- function(input, output, session){
  
  dat <- reactiveVal(data.frame(x=runif(5),y=runif(5)))
  
  dat1 <- reactive({
    if(is.null(input$hot)){dat()} 
    else {as.data.frame(hot_to_r(input$hot))}
  }) # close reactive
  
  observeEvent(input$show,{showModal(modalDialog(rHandsontableOutput("hot")))})
  
  observeEvent(input$reset,{dat(data.frame(x=runif(5),y=runif(5)))})
  
  output$hot <- renderRHandsontable(rhandsontable(dat1()))
  
} # close Server

shinyApp(ui,server)
 

введите описание изображения здесь

введите описание изображения здесь

А ниже приведено изображение, показывающее затемненную таблицу после внесения в нее изменений и нажатия кнопки «Показать» (вместо этого должна появиться вся таблица).:

введите описание изображения здесь

Ответ №1:

Ваше состояние if(is.null(input$hot)){dat()} блокирует сброс.

Пожалуйста, проверьте следующее:

 library(shiny)
library(rhandsontable)

ui <- fluidPage(actionButton("show", "Show"),
                actionButton("reset", "Reset"))

server <- function(input, output, session) {
  dat <- reactiveVal(data.frame(x = runif(5), y = runif(5)))
  
  observeEvent(input$hot, {
    dat(as.data.frame(hot_to_r(input$hot)))
  })
  
  observeEvent(input$show, {
    showModal(modalDialog(rHandsontableOutput("hot")))
  })
  
  observeEvent(input$reset, {
    dat(data.frame(x = runif(5), y = runif(5)))
  })
  
  output$hot <- renderRHandsontable({
    # input$show
    rhandsontable(dat())
  })
  
} # close Server

shinyApp(ui, server)
 

Комментарии:

1. Технически это работает. Но теперь, когда вы нажимаете «Показать» после изменения таблицы, в модальном диалоге отображается только часть таблицы. Чтобы отобразить всю таблицу целиком, вам нужно щелкнуть в любом месте таблицы. Есть ли какой-нибудь способ исправить это без потери полного отображения таблицы?

2. Мы можем обойти это, изменив таблицу после нажатия show . Тот же эффект можно увидеть в вашем примере в течение короткого периода времени — возможно, это ошибка rhandsontable . Пожалуйста, посмотрите мою правку.

3. Но теперь сброс перестал работать. Хммм…действительно кажется глючным

4. Да, здесь что — то странное. Возможно, вы захотите подать заявление о проблеме .

5. Ссылка на соответствующую проблему GitHub: github.com/jrowen/rhandsontable/issues/387