Hi all,
I have a big shiny app with modules and I am converting some of these in R6 classes. All works well except for nested modules: I am facing an issue with namespaces and the uiOutput does not work.
Here is a reproductible example. The class ClassTest is the last class of the hierarchy of classes. It is called either directly by the App or via the Temp class. In the latter case (nested class), the elements contained in the uiOutput does not work.
library(shiny); library(R6)
ClassTest = R6Class(
"ClassTest",
public = list(
# attributes
id = NULL,
# initialize
initialize = function(id){
self$id = id
},
# UI
ui = function(){
ns = NS(self$id)
tagList(
h4('Test class'),
uiOutput(ns('showText'))
)
},
# server
server = function(id){
moduleServer(id,
function(input, output, session){
ns = session$ns
output$showText <- renderUI({
print('In showText <- renderUI')
tagList(
p('I am the showText renderUI of the Test class')
)
})
}
)
},
call = function(input, ouput, session){
self$server(self$id)
}
)
)
#----------------------------------------------------------
Temp = R6Class(
"Temp",
public = list(
# attributes
temp = NULL,
id = NULL,
# initialize
initialize = function(id){
self$id = id
self$temp <- ClassTest$new('testTiers')
},
# UI
ui = function(){
ns = NS(self$id)
tagList(
uiOutput(ns('showTestClass'))
)
},
# server
server = function(id){
moduleServer(id,
function(input, output, session){
ns = session$ns
output$showTestClass <- renderUI({
self$temp$ui()
})
})
},
call = function(input, ouput, session){
self$server(self$id)
}
)
)
#----------------------------------------------------------
App = R6Class(
"App",
public = list(
# attributes
temp = NULL,
classT = NULL,
# initialize
initialize = function(){
self$temp = Temp$new('temp')
self$classT = ClassTest$new('directTest')
},
# UI
ui = function(){
tagList(
h3('Call by another class'),
self$temp$ui(),
hr(),
h3('Direct call'),
self$classT$ui()
)
},
# server
server = function(input, output, session){
self$temp$call()
self$classT$call()
}
)
)
app = App$new()
shiny::shinyApp(app$ui(), app$server)