【问题标题】:How to access dynamic created rhandsontable values and do calculations in R Shiny?如何访问动态创建的 rhandsontable 值并在 R Shiny 中进行计算?
【发布时间】:2020-10-27 14:31:30
【问题描述】:

我正在尝试制作一个应用程序,它可以在第一个选项卡(输入选项卡)中动态创建多个带有表格的选项卡,并使用动态创建的表格在第二个选项卡(结果选项卡)中进行计算。但是,我不确定如何使用 hot_to_r 函数来访问在 Input 选项卡中创建的表中的值,以便在 Results 选项卡中进行计算。例如,我想在 Input 选项卡的表格中将 i+1 列除以 i 列,然后在 Results 选项卡中显示结果。

以下是示例代码:

library(shiny)
library(rhandsontable)

ui <- navbarPage("App",
                   
                 tabPanel("Input",
                          numericInput('num_of_table', "Number of sub tabs: ", value = 1, min = 1, max = 10),
                          uiOutput("input")),
                 
                 tabPanel("Results",
                          uiOutput("results"))
                   
)

server <- function(input, output,session) {
  
 ### Input ### 
  
  input_table<- reactive({
    list_of_input_table = list()
    
    for (i in c(1:input$num_of_table)){
      mat <- matrix(c(1:25) * i, ncol = 5, nrow = 5)
      list_of_input_table[[i]] = mat
    }
    
    index = c(1:i)
    list_of_input_table[index]
  })
  
  observeEvent(input$num_of_table, {
    lapply(seq_len(input$num_of_table), function(i) {
      output[[paste0('input_table_', i)]] <- renderRHandsontable({
        
        rhandsontable(input_table()[[i]])
      })
    })
  })
  
  output$input <- renderUI({
    
    nTabs = input$num_of_table
    
    myTabs1 = lapply(seq_len(nTabs), function(x){
      tabPanel(paste("Tab", x),
               column(12,
                      rHandsontableOutput(paste0("input_table_", x))))
    })
    do.call(tabsetPanel, myTabs1)
    
  })
  
  ### Results ###
  
  results_table<- reactive({
    list_of_results_table = list()
    list_of_input_table = list()
    
    for (i in c(1:input$num_of_table)){
      for (j in c(1:5)) {
          
        list_of_input_table[[i]] <- as.matrix(hot_to_r(input[[paste0("input_table_",i)]]))
        list_of_results_table[[i]] <- matrix(as.numeric(NA), ncol = 4, nrow = 5)
        list_of_results_table[[i]][,j] <- list_of_input_table[[i]][,j+1][!is.null(list_of_input_table[[i]][,j+1])] / list_of_input_table[[i]][,j]
      
    }}
    
    index = c(1:i)
    list_of_results_table[index]
  })
  
  
  observeEvent(input$num_of_table, {
    lapply(seq_len(input$num_of_table), function(i) {
      output[[paste0('results_table_', i)]] <- renderRHandsontable({
        
        rhandsontable(results_table()[[i]])
      })
    })
  })
  
  output$results <- renderUI({
    
    nTabs = input$num_of_table
    
    myTabs2 = lapply(seq_len(nTabs), function(x){
      tabPanel(paste("Tab", x),
               column(12,
                      rHandsontableOutput(paste0("results_table_", x))))
    })
    do.call(tabsetPanel, myTabs2)
    
  })
}


shinyApp(ui,server)

请帮忙!!

【问题讨论】:

    标签: r dynamic shiny reactive rhandsontable


    【解决方案1】:

    在这种情况下,hot_to_r 似乎没有正确处理矩阵对象。

    请改用data.frame 检查以下内容:

    library(shiny)
    library(rhandsontable)
    
    ui <- navbarPage("App",
                     
                     tabPanel("Input",
                              numericInput('num_of_table', "Number of sub tabs: ", value = 1, min = 1, max = 10),
                              uiOutput("input")),
                     
                     tabPanel("Results",
                              uiOutput("results"))
                     
    )
    
    server <- function(input, output,session) {
      
      ### Input ### 
      input_table <- reactive({
        list_of_input_table = list()
        
        for (i in c(1:input$num_of_table)){
          mat <- matrix(c(1:25) * i, ncol = 5, nrow = 5)
          list_of_input_table[[i]] = as.data.frame(mat)
        }
        
        index = c(1:i)
        list_of_input_table[index]
      })
      
      observeEvent(input$num_of_table, {
        lapply(seq_len(input$num_of_table), function(i) {
          output[[paste0('input_table_', i)]] <- renderRHandsontable({
            rhandsontable(input_table()[[i]])
          })
        })
      })
      
      output$input <- renderUI({
        
        nTabs = input$num_of_table
        
        myTabs1 = lapply(seq_len(nTabs), function(x){
          tabPanel(paste("Tab", x),
                   column(12,
                          rHandsontableOutput(paste0("input_table_", x))))
        })
        do.call(tabsetPanel, myTabs1)
        
      })
      
      ### Results ###
      results_table <- reactive({
        
        list_of_results_table = list()
        for (i in c(1:input$num_of_table)){
          req(input[[paste0("input_table_", i)]])
          list_of_results_table[[i]] <- hot_to_r(input[[paste0("input_table_", i)]])[2:5]/hot_to_r(input[[paste0("input_table_", i)]])[1:4]
          }
        return(list_of_results_table)
      })
      
      
      observeEvent(input$num_of_table, {
        lapply(seq_len(input$num_of_table), function(i) {
          output[[paste0('results_table_', i)]] <- renderRHandsontable({
            
            rhandsontable(results_table()[[i]])
          })
        })
      })
      
      output$results <- renderUI({
        
        nTabs = input$num_of_table
        
        myTabs2 = lapply(seq_len(nTabs), function(x){
          tabPanel(paste("Tab", x),
                   column(12,
                          rHandsontableOutput(paste0("results_table_", x))))
        })
        do.call(tabsetPanel, myTabs2)
        
      })
    }
    
    
    shinyApp(ui,server)
    

    我提交了一个问题here

    【讨论】:

    • 感谢您的帮助@ismirsehregal!
    • 不客气!如果有帮助,请采纳答案。
    猜你喜欢
    • 2017-04-30
    • 2017-10-19
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    相关资源
    最近更新 更多