2017-04-06 8 views
4

コードの一部をシャイニーモジュールに変換しようとしていますが、lapply()で生成されたrenderPlot()関数が機能していないようです。私はこの問題を示すために以下の簡単な例を作成しました。シャイニーモジュールのrenderUI()でlapply()を使用

(注:ここで私はrenderText()呼び出しを使用してんだけど、同じ動作が適用されます)

app_normal.R:

library(shiny) 

ui <- fixedPage(
    h2("Normal example"), 
    uiOutput("test") 
) 

server <- function(input, output, session) { 
    output$test <- renderUI({ 
    lapply(1:3, function(val) { 
     fluidRow(column(12,renderText(paste("Line", val)))) 
    }) 
    }) 
} 

shinyApp(ui, server) 

app_module.R:

library(shiny) 

myModuleUI <- function(id) { 
    ns <- NS(id) 
    uiOutput(ns("test")) 
} 

myModule <- function(input, output, session) { 
    output$test <- renderUI({ 
    lapply(1:3, function(val) { 
     fluidRow(column(12,renderText(paste("Line", val)))) 
    }) 
    }) 
} 

ui <- fixedPage(
    h2("Module example"), 
    myModuleUI("test_module") 
) 

server <- function(input, output, session) { 
    callModule(myModule, "test_module") 
} 

shinyApp(ui, server) 

div要素はすべて作成されていますが、プロット/テキストは含まれていません。 Shiny renderText()またはrenderPlot()の機能をモジュール内でrenderUI()/lapply()コール内で正しく使用するにはどうすればよいですか?

+0

実際に私は 'renderText()'モジュールの例を取り出し、12(単に 'fluidRow(カラムを呼び出す場合、 paste( "Line"、val))) 'うまくいくようです。 – MrFlick

+0

@MrFlick 'renderText()'を削除するとモジュールは 'lapply()'からテキストを出力することができますが、 'renderPlot()'関数を使っている私の実際のアプリケーションでは実装できません。 –

+0

'renderUI()'が 'renderPlot()'を呼び出さずに 'plotOutput()'を出力しているはずです。 'renderPlot()'はそれらの出力の無効な値でなければなりません。 https://groups.google.com/forum/#!topic/shiny-discuss/HdCMHN8yjGM – MrFlick

答えて

1

私がrenderText()renderPlot()を使用して取っていたアプローチは、通常の場合、すなわちシャイニーモジュール内で動作していないときにはうまく機能するように見えます。renderUI() Shinyは自動的に必要なtextOutput()またはplotOutput()を呼び出してHTMLを生成します。シャイニーモジュール内で同じ操作を実行しているときに、この自動リンクがどのように壊れているか。これはoutputIdoutputPlot()またはoutputText()への呼び出しで手動で割り当てたときにns()コールが導入されたために、outputリスト内のアイテムの割り当てと参照の不一致によるものと思われます。成功した光沢のあるモジュール内renderUIを使用するには

、あなたは別にtextOutput()renderText()を呼び出す必要があります:renderUI()lapply()textOutput、そしてlapply()renderText()observe()に。これにより、textOutput()コールのoutputIdの生成にns()を導入することができます。

以下、この2つの呼び出しのデテンシャングを示すapp_normal.Rapp_module.Rの両方のリファクタリングを示しました。

app_normal_observe.R:

library(shiny) 

ui <- fixedPage(
    h2("Normal example"), 
    uiOutput("test") 
) 

server <- function(input, output, session) { 
    output$test <- renderUI({ 
    lapply(1:3, function(val) { 
     fluidRow(column(12,textOutput(paste0("line_", val)))) 
    }) 
    }) 

    observe({ 
    lapply(1:3, function(val) { 
     output[[paste0("line_", val)]] <- renderText(paste("Line", val)) 
    }) 
    }) 
} 

shinyApp(ui, server) 

app_module_observe.R:

library(shiny) 

myModuleUI <- function(id) { 
    ns <- NS(id) 
    uiOutput(ns("test")) 
} 

myModule <- function(input, output, session) { 
    output$test <- renderUI({ 
    lapply(1:3, function(val) { 
     fluidRow(column(12,textOutput(session$ns(paste0("line_", val))))) 
    }) 
    }) 

    observe({ 
    lapply(1:3, function(val) { 
     output[[paste0("line_", val)]] <- renderText(paste("Line", val)) 
    }) 
    }) 
} 

ui <- fixedPage(
    h2("Module example"), 
    myModuleUI("test_module") 
) 

server <- function(input, output, session) { 
    callModule(myModule, "test_module") 
} 

shinyApp(ui, server) 
+0

上記の提案に感謝@MrFlick。 groups.google.com/forum/#!topic/shiny-discuss/HdCMHN8yjGMリンクは、観測の使用と、動作中のアプリケーションを生成した2つの呼び出し( 'renderText()'と 'textOutput()')の分離を示しました。 –

関連する問題