Динамический handsontable с помощью переключателей - PullRequest
0 голосов
/ 21 октября 2019

Привет, хотелось бы иметь динамический (с изменяющимся числом строк) разборчивый, используя ввод с переключателей.

Так что я работал над блестящим, который нуждается в вводе данных в таблицу. Однако при добавлении большей сложности понадобился годовой вариант. Так что с текущей таблицей я мог бы попросить пользователя заполнить только первую строку, но это просто не красиво.

Это воспроизводимый пример таблицы в ее нынешнем виде

library(shiny)
library(rhandsontable)

ui <- fluidPage(
  br(),
  rHandsontableOutput('table'),
  textOutput('result'),
  br(),
  actionButton("recalc", "re-enter data")
)

rowNames <- c("Spring", "Summer", "Autum", "Winter", "Sum")
defaultDF <- data.frame(
    row.names = rowNames,
    Lake = rep(NA_integer_, 5),
    Beach = rep(NA_integer_, 5),
    Garden = rep(NA_integer_, 5),
    stringsAsFactors = FALSE
  )

server <- function(input, output, session)
  ({
    values <- reactiveValues(data = defaultDF) ## assign it with NULL

    ## button press resets now the data frame
    observeEvent(input$recalc, {
      values$data[] <- NA_integer_
    })

    observe({
      req(input$table)
        DF <- hot_to_r(input$table)
        DF[setdiff(rowNames, "Sum"),]
        DF["Sum",] <- colSums(DF[setdiff(rowNames, "Sum"),], na.rm = TRUE)
        values$data <- DF
    })

    output$table <- renderRHandsontable({
      req(values$data)
      rhandsontable(values$data, rowHeaderWidth = 100) %>%
        hot_row(nrow(values$data), readOnly = TRUE)
    })

  })

shinyApp(ui = ui, server = server)

Что я пытаюсь сделать (в коде ниже), это использовать значение в переключателях дляизменить количество строк в таблице. К сожалению, это не сработало. Любой указатель будет очень признателен.

library(shiny)
library(rhandsontable)

ui <- fluidPage(
  br(),
  rHandsontableOutput('table'),
  textOutput('result'),
  br(),
  actionButton("recalc", "re-enter data")

  radioButtons("Step", label = h4("Choose Step"),
               choices = list("Annual" = 2, "Season" = 5), 
               inline= TRUE, selected = 1),
)


server <- function(input, output) ({

    tabval<- reactive({

    SeasonAnunal<- rowNames <- if (input$Step==2){ rowNames <- c("Spring", "Summer", "Autum", "Winter", "Sum")
    } else{
    rowNames <-c("Annual","Sum")}

    defaultDF <- data.frame(
      row.names = rowNames,
      Lake = rep(NA_integer_, tabval()),
      Beach = rep(NA_integer_, tabval()),
      Garden = rep(NA_integer_, tabval()),
      stringsAsFactors = FALSE)
  })

    values <- reactiveValues(data = defaultDF) ## assign it with NULL

    ## button press resets now the data frame
    observeEvent(input$recalc, {
      values$data[] <- NA_integer_
    })

    observe({
      req(input$table)
      DF <- hot_to_r(input$table)
      DF[setdiff(rowNames, "Sum"),]
      DF["Sum",] <- colSums(DF[setdiff(rowNames, "Sum"),], na.rm = TRUE)
      values$data <- DF
    })

    output$table <- renderRHandsontable({
      req(values$data)
      rhandsontable(values$data, rowHeaderWidth = 100) %>%
        hot_row(nrow(values$data), readOnly = TRUE)
    })

  })

shinyApp(ui = ui, server = server)

1 Ответ

1 голос
/ 21 октября 2019

Я не уверен, как должна выглядеть ваша годовая таблица, но, пожалуйста, проверьте следующее:

library(shiny)
library(rhandsontable)

ui <- fluidPage(
  br(),
  rHandsontableOutput('table'),
  textOutput('result'),
  br(),
  actionButton("recalc", "re-enter data"),
  radioButtons("Step", label = h4("Choose Step"),
               choices = list("Annual" = 2, "Season" = 5), 
               inline= TRUE, selected = 2)
)

rowNames <- list("5" = c("Spring", "Summer", "Autum", "Winter", "Sum"), "2" = c("Year", "Sum"))

server <- function(input, output, session)
  ({

    values <- reactiveValues(data = NULL) ## assign it with NULL

    observeEvent(input$Step, {
      req(input$Step)
      values$data <- data.frame(
        row.names = rowNames[[input$Step]],
        Lake = rep(NA_integer_, as.integer(input$Step)),
        Beach = rep(NA_integer_, as.integer(input$Step)),
        Garden = rep(NA_integer_, as.integer(input$Step)),
        stringsAsFactors = FALSE
      )
    })


    ## button press resets now the data frame
    observeEvent(input$recalc, {
      values$data[] <- NA_integer_
    })

    observe({
      req(input$table)
      DF <- hot_to_r(input$table)
      DF[setdiff(rownames(DF), "Sum"),]
      DF["Sum",] <- colSums(DF[setdiff(rownames(DF), "Sum"),], na.rm = TRUE)
      values$data <- DF
    })

    output$table <- renderRHandsontable({
      req(values$data)
      rhandsontable(values$data, rowHeaderWidth = 100) %>%
        hot_row(nrow(values$data), readOnly = TRUE)
    })

  })

shinyApp(ui = ui, server = server)
...