R shinyapp:renderUI不适用于嵌套模块R6类
我有一个很大的有模块的闪亮应用程序,我正在R6类中转换其中的一些。除了嵌套模块外,所有模块都可以正常工作:我面临名称空间问题,uiOutput无法工作R shinyapp:renderUI不适用于嵌套模块R6类,r,shiny,module,r6,R,Shiny,Module,R6,我有一个很大的有模块的闪亮应用程序,我正在R6类中转换其中的一些。除了嵌套模块外,所有模块都可以正常工作:我面临名称空间问题,uiOutput无法工作 library(shiny); library(R6) ClassTest = R6Class( "ClassTest", public = list( # attributes id = NULL, # initialize initialize = function(id){ self$id
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)
这是一个可复制的例子。类ClassTest是类层次结构的最后一个类。它可以由应用程序直接调用,也可以通过Temp类调用。在后一种情况下(嵌套类),uiOutput中包含的元素不起作用
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)
库(闪亮);图书馆(R6)
ClassTest=R6Class(
“类测试”,
公共=列表(
#属性
id=NULL,
#初始化
初始化=函数(id){
self$id=id
},
#用户界面
ui=函数(){
ns=ns(自我$id)
标签列表(
h4(“测试类”),
uiOutput(ns('showText'))
)
},
#服务器
服务器=功能(id){
模块服务器(id,
功能(输入、输出、会话){
ns=会话$ns
output$showText您的代码有点复杂,但我确信您没有调用母类中子类的服务器,子模块也需要尊重母类名称空间。下面是一个工作示例,它实现了它的目标:
库(闪亮)
图书馆(R6)
MyModule