R语言 shiny中的datatable填充一个初始表,并允许用户更新其中一列,当他们单击“更新”时,其他列将发生变化

m1m5dgzv  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(147)

我有一个涉及优化的项目,优化后的结果会以数据表的形式显示在UI中。但是,应该优化的值应该是可编辑的,以便用户可以尝试优化各种值。下面我有一个非常简单的示例。有一个带有预算的初始 Dataframe ,预算是为mrA和mrB分配的。现在,如果我想更改任何预算值,并且在单击更新按钮时,mrA和mrB列获得新值,该怎么办?

library(DT)
library(shiny)
library(tidyverse)
initial_budget = tibble(country = c('us', 'fr', 'de'),
                        budget = c(100, 200, 300))

ui <- fluidPage(

   DT::dataTableOutput('allocated')
)

server <- function(input, output) {
  output$allocated = DT::renderDataTable({
    df = initial_budget
    df = df %>% mutate(mrA = budget * 0.25,
                       mrB = budget * 0.75)
    df
    
  })

    
}

shinyApp(ui = ui, server = server)
rqqzpn5f

rqqzpn5f1#

下面是一个简短的演示,可能会有所帮助。
创建一个reactiveVal ue来存储你的预算(初始设置为initial_budget)。
创建一个proxy来操作数据表。使用observeEvent可以跟踪编辑,然后更新reactive data.frame。
当数据被修改时,额外的observe将重新计算其他值。

library(DT)
library(shiny)
library(tidyverse)

initial_budget = tibble(country = c('us', 'fr', 'de'),
                        budget = c(100, 200, 300))

ui <- fluidPage(
  DT::dataTableOutput('allocated')
)

server <- function(input, output) {
  
  df <- reactiveVal(initial_budget)
  
  observe({
    df(mutate(df(), mrA = budget * 0.25, mrB = budget * 0.75))
  })
  
  proxy <- dataTableProxy('allocated')
  
  observeEvent(input[["allocated_cell_edit"]], {
    info <- input[["allocated_cell_edit"]]
    df(editData(df(), info, proxy))
  })
  
  output$allocated <- DT::renderDataTable(df(), editable = TRUE)
  
}

shinyApp(ui = ui, server = server)

相关问题