Stworzyłem tabele DT z linkami między tabelą główną a tabelami podrzędnymi, które mają tabelę podrzędną itp.

Klikam na mistrza stołu i przechodzę od stołu do stołów. A czasami początkowa selekcja jest tracona.

Pierwotnym celem było posiadanie 2 baz danych, archiwum i czasu teraźniejszego. Mam przycisk radiowy do przełączania między 2 bazami danych. Więc muszę umieścić we wszystkich funkcjach reaktywnych funkcję, aby ponownie połączyć się lub nie z poprawnie wybraną bazą danych.

Czy pytanie dotyczy przepełnienia stosu lub błędu?

To jest dla dużej aplikacji.

Ale mam ten sam problem dla prostej (starej) aplikacji bez DT i bez ponownego połączenia między bazą danych.

Proste i duże aplikacje Shiny są wielodostępne, a każdy użytkownik może korzystać z wielu kart w swojej przeglądarce.

Z góry dziękuję :)

Moja struktura dużej aplikacji:

serwer.r

database_name_decale<-"blabla_decale"
database_name_archive<-"blabla_archive"

connexion_bdd_odbc_decale_txt <- paste0('driver={ODBC Driver 17 for SQL Server};server=blabla;database=',database_name_decale,';uid=xxx;pwd=xxx;')
connexion_bdd_odbc_archive_txt <- paste0('driver={ODBC Driver 17 for SQL Server};server=blabla;database=',database_name_archive,';uid=xx;pwd=xx;')
...
shinyServer(function(input, output, session) {
  react <- reactiveValues( connexion_bdd = 0) 
  observeEvent(
  c(
    input$radiob.ChoixBase
  ),
  {
   Init_cnx_bdd.fct_react (input,output,session, change_base= TRUE)

 })
...
  observeEvent(input$NavTabPanels, {
    Init_cnx_bdd.fct_react (input,output,session, change_base= FALSE)
    if (input$NavTabPanels=="My_Menu") {
...
      My_Menu_maitre.tab.fct_react (input,output,session)  
    }
  })  
...
  My_Menu_maitre.tab.fct_react <- function (input,output,session) {
...
    detail.table <-  reactive({
      Init_cnx_bdd.fct_react (input,output,session, change_base = FALSE)
      input_appelant=  input$My_Menu_maitre_rows_selected
      validate(
        need(!is.null(input_appelant) , "Select a line from master")
      )                 
      res<-  data.frame() 
      table_details <-subset( My_Menu_maitre.table()[as.integer(input_appelant), ],
                              select=c("id_num"))
      res<- detail.reqSQL.fct (react$connexion_bdd,as.data.frame(table_details))            
      return(res)
    })  
...
    sub_detail.table <-  reactive({...})
...
    sub_sub_detail.table <-  reactive({...})
...
    sub_sub_sub_detail.table <-  reactive({...})

Z tą funkcją

Init_cnx_bdd.fct_react <- function (input,output,session,   change_base) {
    req(react$connexion_bdd)
    if(input$radiob.ChoixBase == "BaseActuelle")   {
      output$BaseCouranteTxt <-renderText({"Actuelle"})
      if (change_base==TRUE) {
          tryCatch(
            {
              odbcClose(react$connexion_bdd)
            },
            error=function(e) { # print("e")
              },
            warning=function(w) { # print("w")  
              }
          )
          react$connexion_bdd<-odbcDriverConnect(connexion_bdd_odbc_decale_txt)
      } else {
          tryCatch(
            {
              odbcGetInfo(react$connexion_bdd)
            },
            error=function(e) {   print("e")
              react$connexion_bdd<-odbcDriverConnect(connexion_bdd_odbc_decale_txt)
            },
            warning=function(w) {  print("w")
            }
          )
      }

}

    if(input$Technique.Connexions.radiob.ChoixBase == "BaseArchive")   {
      output$Home.Technique.BaseCouranteTxt <-renderText({"Archive"})
      if (change_base==TRUE) {
          tryCatch(
            {
              odbcClose(react$connexion_bdd)
            },
            error=function(e) {  #print("e")
            },
            warning=function(w) { # print("w")   
            }
          )
          react$connexion_bdd<-odbcDriverConnect(connexion_bdd_odbc_archive_txt)
      } else {
        tryCatch(
          {
            odbcGetInfo(react$connexion_bdd)
          },
          error=function(e) { #  print("e")
            react$connexion_bdd<-odbcDriverConnect(connexion_bdd_odbc_archive_txt)
          },
          warning=function(w) { # print("w")
          }
        )
      }

    }
}

Moja struktura małej aplikacji:

serwer.r

connexion_bdd_odbc_txt='driver={ODBC Driver 11 for SQL Server};server=xxx;database=blabla_decale;uid=xx;pwd=xxx;'
...
shinyServer(function(input, output,session) {
...
table.brut<-reactive({
  connexion_bdd <- odbcDriverConnect(connexion_bdd_odbc_txt, readOnly = TRUE)  
  table<-sqlQuery(connexion_bdd, "SELECT * FROM blabla")
  odbcClose(connexion_bdd)
  table<-as.data.frame(table)

  return(table)
})
...
and other tables and reactive function, not of the DT package, and a few linked between them.
0
phili_b 15 listopad 2018, 21:39

1 odpowiedź

Najlepsza odpowiedź

Wygląda na to, że używam „anty-rozwiązania” (nazwanego przez Joe Chenga w jego samouczku wideo).

Anty-rozwiązanie

observe ({
    df<-head(cars, input$nrows)
    output$plot <- renderPlot(plot(df))
})

Dobre rozwiązanie

output$plot <- renderPlot({
    plot(head(cars, input$nrows))
})

Zamierzam zmodyfikować mój kod, jest rozwiązany.

https://github.com/rstudio/shiny/issues/2262

edytuj 17.01.2018

Dla informacji: przyczyną przegranych wyborów było nie tylko stosowanie „antyrozwiązania”. Po korekcie sprawa trochę się powtórzyła.

Wymieniłem RODBC na DBI i RStudio/odbc i problem już nie występuje.

0
phili_b 17 styczeń 2019, 19:20