在 R/Shiny 中,为什么当我使用模块时不显示我的 ggplots?

In R/Shiny why my ggplots are not displayed when I am working with modules?

提问人:JohnBones JohnBones 提问时间:11/22/2022 最后编辑:ismirsehregalJohnBones JohnBones 更新时间:11/22/2022 访问量:34

问:

这是我的应用代码:

library(shiny)
library(tidyverse)

source('module.R')

ui <- fluidPage(
  
  tabpanel_UI("mod1")
)

server <- function(input, output, session) {
  
  tabpanel_Server("mod1")
  
}

shinyApp(ui, server)

这是我的模块文件:'module.R'

tabpanel_function <- function(x,n){     
   
  tabPanel(paste0("Panel",x),               
           plotOutput(paste0("chart_",n))
  )      
}

tabpanel_UI <- function(id) {
  ns <- NS(id)
  tagList(        
    tabsetPanel(id = ns("x"),
                tabPanel("Panela"),
                tabPanel("Panelb"),
                tabPanel("Panelc")     
                
    )      
  )
}

tabpanel_Server <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {         
      
      1:4 %>% map(~ tabpanel_function(.x, n = .x) %>% appendTab("x", .))          
      
      output$chart_1 <- renderPlot({
        ggplot(mtcars, aes(cyl,mpg)) + geom_line(color  ='red')
      })
      
      output$chart_2 <- renderPlot({
        ggplot(mtcars, aes(cyl,mpg)) + geom_line(color  ='green')
      })
      output$chart_3 <- renderPlot({
        ggplot(mtcars, aes(cyl,mpg)) + geom_line(color  ='blue')
      })
      
      output$chart_4 <- renderPlot({
        ggplot(mtcars, aes(cyl,mpg)) + geom_line(color  ='yellow')
      })
      
    }
  )
}

我在这里错过了什么?

这是一个问题:在 R/Shiny 中,如何使用我创建的 purrr::map 创建其他面板,但不考虑模块。事实证明,我将需要使用模块,并且图表没有显示。有什么帮助吗?

r 闪亮

评论

2赞 Stéphane Laurent 11/22/2022
您需要在函数中使用命名空间 ()。ns
0赞 JohnBones JohnBones 11/22/2022
plotOutput(NS(paste0("chart_",n)))@StéphaneLaurent这样的?

答:

2赞 Stéphane Laurent 11/22/2022 #1

您必须使用命名空间

tabpanel_function <- function(id, x, n){     
  ns <- NS(id) 
  tabPanel(paste0("Panel", x),               
           plotOutput(ns(paste0("chart_", n)))
  )      
}

和:

1:4 %>% map(~ tabpanel_function(id, .x, n = .x) %>% appendTab("x", .))          
1赞 thothal 11/22/2022 #2

您需要命名空间您的动态:plotOutputs

tabpanel_function <- function(x, n, ns){     
  tabPanel(paste0("Panel",x),               
           plotOutput(ns(paste0("chart_",n)))
  )      
}

## [....]

1:4 %>% map(~ tabpanel_function(.x, n = .x, session$ns) %>% appendTab("x", .))    

Dynamic ggplot within a dynamic panel