渲染*函数不会在闪亮模块内的modalDialog中显示

时间:2018-04-08 18:33:36

标签: r shiny

我一直在使用imports: [ HttpClientModule ] 在我的闪亮应用中将图形显示为弹出窗口,但是当我将它们放入闪亮的模块中时,这些图形不会呈现。

下面的简短回复:非模块触发模态显示图形,模块触发模态将其空白。有人有主意吗?模态本身正确显示,模态的非反应内容也是如此(例如showModal(modalDialog(...))

ModalDialog('some text')

SessionInfo:

library(shiny)

# Module UI
myModuleUI = function(id){
  ns = NS(id)

  fluidRow(
    actionButton(ns('button'), 'Module')
  )
}

# Module server
myModule = function(input, output, session){
  observeEvent(input$button, {
    showModal(
      modalDialog(
        # This renderPlot does not display
        renderPlot(ggplot2::qplot(mtcars$mpg))
      )
    )
  })
}

# App UI
ui = fluidPage(
  fluidRow(
    actionButton('nonModule', 'Non-module'),
    myModuleUI('module')
  )
)

# App server
server = function(input, output) {
  modalFunc = function() {
    return(modalDialog(renderText("Non-Module"),
                       renderPlot(ggplot2::qplot(mtcars$mpg))))
  }

  observeEvent(input$nonModule, {
    showModal(
      modalDialog(
        # This renderPlot does display
        renderPlot(ggplot2::qplot(mtcars$mpg))
      )
    )
  })

  callModule(myModule, 'module')
}

# Run the application
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

修改

在发布此答案后,我在GitHub上报告了这种行为以解决问题跟踪系统,并在几天后提供了A/B testing environment。因此,您可以从GitHub更新闪亮到最新版本,以使其工作。或者,使用我在下面提供的解决方案。

原始答案

如果为绘图分配单独的output插槽,则两个模态都能正常工作。

myModule = function(input, output, session){
  output$plot <- renderPlot({
    ggplot2::qplot(mtcars$mpg)
  })

  observeEvent(input$button, {
    showModal(
      modalDialog(
        # This plot does display
        plotOutput(session$ns("plot"))
      )
    )
  })
}

我不确定是什么原因引起的。您是否观察到与其他渲染函数相同的行为?

我猜测为什么会发生这种情况

在ui定义中使用renderXXX的AFAIK(例如...中的modalDialog参数)仅适用于RMarkdown个文档。例如,outputArgs?renderPlot参数的文档读取

  

outputArgs 在交互式R Markdown文档中使用renderPlot时,要传递给plotOutput的隐式调用的参数列表。

?markRenderFunction中可以找到类似的陈述。所以

的事实
showModal(modalDialog(renderPlot(...)))

即使在RMarkdown个文档之外工作,也是一个无证件,因此不可靠的功能。