Выбор между хозяином и потерянным потомком (невоспроизводимая ошибка, данные из базы данных) - PullRequest
0 голосов
/ 15 ноября 2018

Я создал таблицы DT со связями между главной таблицей и дочерними таблицами, у которых есть дочерняя таблица и т. Д. *

Я нажимаю на мастер таблицы и перехожу из таблицы в таблицы. И иногда первоначальный выбор теряется.

Первоначальная цель состояла в том, чтобы иметь 2 базы данных, архив и настоящее время. У меня есть переключатель для переключения между 2 базами данных. Поэтому я должен добавить во все реактивные функции функцию повторного подключения или нет к правильно выбранной базе данных.

Это вопрос для stackoverflow или ошибка?

Это для большого приложения.

Но у меня та же проблема для простого (старого) приложения без DT и без переподключения между базами данных.

Простые и большие приложения Shiny являются многопользовательскими, и каждый пользователь может использовать в своем браузере несколько вкладок.

Заранее спасибо:)

Моя структура большого приложения:

server.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({...})

С этой функцией

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")
          }
        )
      }

    }
}

Моя структура маленького приложения :

server.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.

1 Ответ

0 голосов
/ 22 ноября 2018

Похоже, я использую «анти-решение» (названное Джо Ченгом в его видеоуроке).

анти-решение

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

хорошее решение

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

Я собираюсь изменить свой код, это решено.

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

edit 17/1/2018

Дляинформация: причиной потерянных выборов стало не только использование «антираствора».После исправления проблема снова продолжалась.

Я заменил RODBC на DBI и RStudio / odbc, и проблема больше не возникает.

...