Я создал таблицы 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.