使用单选按钮进行动态动手操作

时间:2019-10-21 12:31:05

标签: r shiny rhandsontable

Hi希望使用单选按钮的输入来动态显示(行数不断变化)。

所以我一直在研究需要将数据输入到表中的表笔。但是,当增加更多的复杂性时,则需要年度选项。因此,使用当前表,我可以要求用户仅填写第一行,但这并不是很漂亮。

这是当前表格的可复制示例

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 个答案:

答案 0 :(得分:1)

我不确定您的年表如何显示,但请检查以下内容:

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)