R блестящий модуль с кнопкой сохранения

#r #shiny

#r #блестящий

Вопрос:

Я настраиваю модуль с целью создания двух таблиц данных в одном приложении на разных вкладках. Я хотел бы иметь возможность редактировать и сохранять каждую таблицу отдельно. В моем коде работает только первая кнопка «сохранить», и она сохраняет обе таблицы данных.

В идеале каждая кнопка сохранения должна работать и сохранять только соответствующую таблицу.

Важно: я использую модифицированную версию DTedit:

 devtools::install_github('DavidPatShuiFong/DTedit@2.2.1')
  

Вот мой проблемный код:

 library(shiny)
library(DTedit)

myModuleUI <- function(id,nam) {
  ns <- shiny::NS(id)
  shiny::tagList(
    
    br(),
    
    ##### needs corrections!!
    
    tabsetPanel(tabPanel("XXX",  dteditmodUI(ns(nam)),actionButton(ns("reset"), "Reset to Saved", styleclass = "warning"),  actionButton(ns("saveBtn"), label = "save"),  br(),
                         id=ns('tabset'), type = 'tabs')
    )
  )
  ####
}

myModule <- function(input, output, session,df,nam,taby,wb) {
  
  dfr=reactiveVal()
  dfr(df)
  
  
  Grocery_List_Results <- shiny::callModule(
    dteditmod,
    id = nam,
    thedata =dfr)
    
   

  # ### save  part
  
  savd = data.frame(isolate(dfr()))
  
  observeEvent(input$saveBtn, {
    
    print("Q")
    ## Add worksheets
    st = paste(taby,as.character(unclass(Sys.time())),sep="_")
    addWorksheet(wb, st)
    
    writeData(x = Grocery_List_Results$thedata,
              wb = wb,
              sheet = st)
    
    
    saveWorkbook(wb, "wb.xlsx", overwrite = T)
    
    savd <<- Grocery_List_Results$thedata
    
    
    shinyalert(title = "Saved!", type = "success")
  })
  
  observeEvent(input$reset, {
    dfr(savd)
    print(dfr)
    
    shinyalert(title = "Reset to saved data!", type = "info")
  })
  
  
}






########

ui <- fluidPage(
  h3('Grocery List'),
  myModuleUI('myModule1',nam="groc"),br(),
  myModuleUI('myModule1',nam="groc2")
)

server <- function(input, output, session) {
  
  df= data.frame(
    Buy = c('Tea', 'Biscuits', 'Apples',"Tea","Apples"),
    Quantity = c(7, 2, 5,9,44),
    stringsAsFactors = FALSE
  )
  
  file = "AICs.xlsx"
  wb <- loadWorkbook(file)
  
  
  shiny::callModule(myModule, 'myModule1',nam="groc",df=df,taby="Tea",wb)
  shiny::callModule(myModule, 'myModule1',nam="groc2",df=df,taby="Apples",wb)
}


shinyApp(ui = ui, server = server)

  

Ценю ваше время!

Комментарии:

1. Я не смог полностью отладить код, поскольку у меня нет доступа к файлу Excel, на который ссылается код, но одна из возможных проблем заключается в том, что … * вызовы myModuleUI должны иметь параметры myModule1 для первого вызова и (например) myModule2 для второго вызова * аналогично, callModule вызов должен иметь параметр myModule1 для первого вызова, а затем myModule2 для второго вызова.

Ответ №1:

Наконец, и благодаря этому потоку, кажется, что мне удалось решить эту:

 library( "openxlsx"  )
library("shiny" )    
library(shinyalert)
library(shinysky)
library(DTedit) ## used the modified version from https://github.com/DavidPatShuiFong/DTedit
#installed with devtools::install_github('DavidPatShuiFong/DTedit@2.2.1')


results_2_UI <- function(id,nam) {
  useShinyalert()
  ns <- NS(id)
  tabPanel(
    title = "Export1",
      dteditmodUI(ns(nam)),
    actionButton(ns("reset"), "Reset to Saved", styleclass = "warning"),  actionButton(ns("saveBtn"), label = "save")
    
  )
}

results_3_UI <- function(id,nam) {
  useShinyalert()
  ns <- NS(id)
  tabPanel(
    title = "Export2",
    dteditmodUI(ns(nam)),
    actionButton(ns("reset"), "Reset to Saved", styleclass = "warning"),  actionButton(ns("saveBtn"), label = "save")
    
  )
}

results <- function(input, output, session,df,nam,taby,wb) {
  ## do some complicated data transformations
  dfr=reactiveVal()
  dfr(df)
  
  
  Grocery_List_Results <- shiny::callModule(
    dteditmod,
    id = nam,
    thedata =dfr)
  
  
  
  # ### save  part
  
  savd = data.frame(isolate(dfr()))
  
  observeEvent(input$saveBtn, {
    
    print("Q")
    ## Add worksheets
    st = paste(taby,as.character(unclass(Sys.time())),sep="_")
    addWorksheet(wb, st)
    
    writeData(x = Grocery_List_Results$thedata,
              wb = wb,
              sheet = st)
    
    
    saveWorkbook(wb, "wb.xlsx", overwrite = T)
    
    savd <<- Grocery_List_Results$thedata
    
    
    shinyalert :: shinyalert(title = "Saved!", type = "success")
  })
  
  observeEvent(input$reset, {
    dfr(savd)
    print(dfr)
    
    shinyalert::shinyalert(title = "Reset to saved data!", type = "info")
  })
  

}
### module end

ui <- fluidPage(
  tabsetPanel(
    id = "tabs",
 
    # results_1_UI(id = "test1"),
    results_2_UI(id = "test2",nam="groc"),
    results_3_UI(id = "test3",nam="groc2")
  )
)

server <- function(input, output, session) {
  
  df= data.frame(
    Buy = c('Tea', 'Biscuits', 'Apples',"Tea","Apples"),
    Quantity = c(7, 2, 5,9,44),
    stringsAsFactors = FALSE
  )
  
  file = "AICs.xlsx"
  wb <- loadWorkbook(file)
  
 
  callModule(
    module = results,
    id = "test2",
    nam="groc",df=df,taby="groc",wb=wb
  )
  
  callModule(
    module = results,
    id = "test3",
    nam="groc2",df=df,taby="groc2",wb=wb
  )
}

shinyApp(ui = ui, server = server)

  

Скрестив пальцы, все в порядке!