#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