R randsontable в Shiny с выбором нескольких столов - PullRequest
0 голосов
/ 23 апреля 2020

Я использую DT, чтобы позволить пользователям отображать и редактировать таблицы в приложении Shiny. Я пытаюсь преобразовать свой код, чтобы использовать вместо него rhandsontable, чтобы обеспечить большую гибкость редактирования для пользователя (код DT в настоящее время закомментирован).

Однако, когда я заменяю renderDT и DTOutput на соответствующий rhandsontable функции я получаю сообщение об ошибке "недопустимый тип индекса" список "". Я предполагаю, что это связано с тем, что мой выбор таблицы происходит в форме списка. Есть ли способ, позволяющий пользователю выбрать таблицу из раскрывающегося списка, а затем разрешить редактировать эту выбранную таблицу с функциональностью rhandsontable?

Спасибо!

library(shiny)
library(DT)
library(rhandsontable)

df1 <- data.frame(a = c('a','b','c','d','e'), 
                  b = round(rnorm(5, 0,1),2),
                  stringsAsFactors = F)
df2 <- data.frame(a = c('a','b','c','d','e'), 
                  b = round(rnorm(5, 1,1.5),2),
                  stringsAsFactors = F)

ui <- fluidPage(
  titlePanel("example"),
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "df",
                  label = "Choose a table:",
                  choices = c("df1", 
                              "df2")),
      textOutput('df1avg'),
      textOutput('df2avg'),
      textOutput('df12')
    ),
    mainPanel(
      actionButton("reset", "Reset"),
      #DTOutput("df")          
      rHandsontableOutput('df')
    )
  )
)

server <- function(input, output) {
  rv <- reactiveValues(tables = list("df1" = df1, "df2" = df2))

  dfInput <- reactive({
    rv$tables[[input$df]]
  })

  observeEvent(input[["df_cell_edit"]], {
    cell <- input[["df_cell_edit"]]
    rv$tables[[input$df]][cell$row, cell$col] <- cell$value
  })

  observeEvent(input$reset, {
    rv$tables <- list("df1" = df1, "df2" = df2)
  })

  output$df1avg <- renderText(mean(as.numeric(rv$tables[["df1"]][,2])))
  output$df2avg <- renderText(mean(as.numeric(rv$tables[["df2"]][,2])))
  output$df12 <- renderText(mean(as.numeric(rv$tables[["df1"]][,2]))*mean(as.numeric(rv$tables[["df2"]][,2])))

  # output$df <- renderDT(dfInput(), editable = TRUE,
  #                       options = list(lengthChange = FALSE))

  output$df <- renderRHandsontable({
    rhandsontable(dfInput())
    })
}

shinyApp(ui = ui, server = server)

...