用户编辑一个表,更改反映在另一个表中

问题描述

我遇到了这个问题,我能找到的最接近的是此处的提交内容,但并没有完全解决我要解决的问题Reactive shiny modules sharing data

请参考上面链接中的更正示例,如果我希望能够编辑表a(x_2列中的单元格),这将自动更新表c(x_2列中的相应单元格)。

谢谢

解决方法

这是一个更简单的版本,不适用于代理(并使用新的模块接口),我希望可以。您可以更改前2个表中的任何值,第3个表显示总和并进行更新。诀窍在于,您在其中编辑数据的模块必须将已编辑的数据作为反应式返回,这些模块将作为变量保存在主服务器功能中。根据这些数据进行更新的模块需要将这些变量作为反应性输入。

非常重要的是:

  • 返回数据的模块需要返回反应式,最简单的方法是return(reactive({returnvalue}))
  • 在服务器功能中,不得评估传递给模块的反应堆,例如您必须使用my_reactive_value而不是my_reactive_value()
### Libraries
library(shiny)
library(dplyr)
library(DT)

### Data----------------------------------------
set.seed(4)
table_a <- data.frame(
  id=seq(from=1,to=10),x_1=rnorm(n=10,mean=0,sd=10),x_2=rnorm(n=10,x_3=rnorm(n=10,sd=10)
) %>% 
  mutate_all(round,3)

table_b <- data.frame(
  id=seq(from=1,sd=10)
)%>% 
  mutate_all(round,3)

mod_table_edit <- function(id,data_initialisation) {
  moduleServer(
    id,function(input,output,session) {
      # initialise the reactive data object for the table
      data <- reactiveValues(table = data_initialisation)
      
      # render the table
      output$table <- renderDT({
        datatable(data$table,editable = TRUE)
      })
      
      # update the underlying data
      observeEvent(input$table_cell_edit,{
        data$table <- editData(data$table,input$table_cell_edit)
      })
      
      # return the data as a reactive
      return(reactive(data$table))
    }
  )
}

mod_table_add <- function(id,data_input_1,data_input_2) {
  moduleServer(
    id,session) {
      # do the calculations
      data_table <- reactive({
        data_input_1() + data_input_2()
      })
      
      # render the table
      output$table <- renderDT({
        datatable(data_table())
      })
    }
  )
}

modFunctionUI <- function(id) {
  ns <- NS(id)
  DTOutput(ns("table"))
}

ui <- fluidPage(
  fluidRow(
    column(4,modFunctionUI("table_1")),column(4,modFunctionUI("table_2")),modFunctionUI("table_3"))
  )
)

server <- function(input,session) {
  # call the modules for the editable tables and store the results
  data_table_1 <- mod_table_edit("table_1",data_initialisation = table_a)
  data_table_2 <- mod_table_edit("table_2",data_initialisation = table_b)
  
  # call the module for the table that takes inputs
  # the reactives musn't be evaluated
  mod_table_add("table_3",data_input_1 = data_table_1,data_input_2 = data_table_2)
}

shinyApp(ui,server)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...