使用编辑表中的值进行Shiny中的计算

时间:2019-07-17 19:27:06

标签: r shiny dt

我正在尝试做的是允许用户将配置/查找excel表传递给Shiny,以光泽显示此表,允许用户以Shiny进行单元格编辑,并使用已编辑的值从可编辑表格中进行计算。我的问题出在最后一步“使用从可编辑表中编辑的值进行计算”。

excel文件包含2个标签,其中包含以下内容的数据:

Tab1名称:“参数” data.frame(Name = c(“ a”,“ b”,“ c”),Value = c(1:3))

Tab2名称:“ parameters2” data.frame(Name = c(“ a”,“ b”,“ c”),Value = c(4:6))

理想的闪亮应用将执行以下操作:

1)在上载时,执行计算,将Tab 1和Tab 2的第一值保持不变。这将是1 + 4 = 5。

2)如果用户将Tab 1的值编辑为1到8,则计算结果将为8 + 4 = 12。

实际上,如果用户对其进行了任何编辑,我想使用编辑后的表格值来更新我的所有计算。我知道可以通过仅以闪亮的方式上传新文件来完成此操作,但我宁愿允许他们以闪亮的方式上传,而不是上传新文件。

这是我的闪亮应用程序。感谢任何帮助/指导!

    library(shiny)
library(DT)
shinyApp(
  ui <- fluidPage(
    fileInput(inputId = "config", label = "Upload Configuration File", 
              multiple = F, accept = c(".xlsx", ".xls")), 
    verbatimTextOutput("txt"), 
    tagList(tags$head(tags$style(type = 'text/css','.navbar-brand{display:none;}')),
            navbarPage(title = "",
                       tabPanel(title = "Parameters",
                                dataTableOutput(outputId = "edit.param", width = 2)), 
                       tabPanel(title = "Parameters2",
                                dataTableOutput(outputId = "edit.param2", width = 2))
            )
    )
  ),
  server = function(input, output, session) {

    config.path = reactive({

      inFile = input$config

      if(is.null(inFile)) {
        return(NULL)
      } else {
        return(inFile$datapath)
      }

    })

    df.param = reactive({
      read_excel(path = config.path(), sheet = "parameters")
    })

    df.param2 = reactive({
      read_excel(path = config.path(), sheet = "parameters2")
    })

    output$edit.param = renderDT(df.param(), selection = "none", server = F, editable = "cell")
    output$edit.param2 = renderDT(df.param2(), selection = "none", server = F, editable = "cell")

    observeEvent(input$edit.param_cell_edit, {
      df.param()[input$edit.param_cell_edit$row, input$edit.param_cell_edit$col] <<- input$edit.param_cell_edit$value
    })

    observeEvent(input$edit.param2_cell_edit, {
      df.param()[input$edit.param2_cell_edit$row, input$edit.param2_cell_edit$col] <<- input$edit.param2_cell_edit$value
    })

    output$txt = reactive({

      df.param()$value[1] + df.param2()$value[1]

    })

  }

)

我也在服务器部分尝试过此操作,也没有运气:

    output$edit.param = renderDT(df.param(), selection = "none", server = F, editable = "cell")
output$edit.param2 = renderDT(df.param2(), selection = "none", server = F, editable = "cell")

observe(input$edit.param_cell_edit)
observe(input$edit.param2_cell_edit)

1 个答案:

答案 0 :(得分:1)

您可以尝试一下吗? (我没有尝试过。)

library(shiny)
library(DT)

shinyApp(
  ui <- fluidPage(
    fileInput(inputId = "config", label = "Upload Configuration File", 
              multiple = F, accept = c(".xlsx", ".xls")), 
    verbatimTextOutput("txt"), 
    tagList(tags$head(tags$style(type = 'text/css','.navbar-brand{display:none;}')),
            navbarPage(title = "",
                       tabPanel(title = "Parameters",
                                dataTableOutput(outputId = "edit_param", width = 2)), 
                       tabPanel(title = "Parameters2",
                                dataTableOutput(outputId = "edit_param2", width = 2))
            )
    )
  ),
  server = function(input, output, session) {

    config.path = reactive({

      inFile = input$config

      if(is.null(inFile)) {
        return(NULL)
      } else {
        return(inFile$datapath)
      }

    })

    df_param <- reactiveVal()
    observe({
      req(config.path())
      df_param(read_excel(path = config.path(), sheet = "parameters"))
    })

    df_param2 <- reactiveVal()
    observe({
      req(config.path())
      df_param2(read_excel(path = config.path(), sheet = "parameters2"))
    })

    output$edit_param = renderDT({
      req(df_param())
      datatable(isolate(df_param()), selection = "none", editable = "cell")
    })
    output$edit_param2 = renderDT({
      req(df_param2())
      datatable(isolate(df_param2()), selection = "none", editable = "cell")
    })

    proxy <- dataTableProxy("edit_param")
    proxy2 <- dataTableProxy("edit_param2")

    observeEvent(input$edit_param_cell_edit, {
      info <- input$edit_param_cell_edit
      df_param(editData(df_param(), info, proxy, resetPaging = FALSE))
    })

    observeEvent(input$edit_param2_cell_edit, {
      info <- input$edit_param2_cell_edit
      df_param2(editData(df_param2(), info, proxy2, resetPaging = FALSE))
    })

    output$txt = renderPrint({
      df_param()$value[1] + df_param2()$value[1]
    })

  }

)