2017-05-26 20 views
0

私は、光沢のあるタブボックス内の2つの別々のタブパネルに同じヒストグラムをプロットしようとしています。私はタブの1つにデータをプロットすることができますが、私は別のコードを追加すると、アプリケーションを壊すようです。以下は、私がやろうとしているの例です。この特定の例では光沢のある2つのtabPanelで同じ出力をプロットする

library(shiny) 
    library(dplyr) 

data(mtcars) 

body <- dashboardBody(
    fluidRow(
    tabBox(
     title = "miles per gallon", 

     id = "tabset1", height = "250px", 
     tabPanel("Tab1", plotOutput("plot1")), 
     tabPanel("Tab2", plotOutput("plot1"), "test") # the app 'breaks' when I add in the **plotOutput("plot1")** here... however it works when I remove it 
    ) 
    ) 
) 

shinyApp(
    ui = dashboardPage(
    dashboardHeader(title = "Test"), 
    dashboardSidebar(), 
    body 
), 
    server = function(input, output) { 


     output$plot1 <- renderPlot({hist(mtcars$mpg)}) 

    } 
) 

、私はちょうどこの

output$plot2 <- renderPlot({hist(mtcars$mpg)}) 

のように、サーバー内の別の行を追加してからplot2を呼び出して、私の実際の可能性appは上記の例より少し複雑ですので、両方のタブにplot1をプロットしたいと思います。

答えて

2

光沢のあるアプリケーションを作成すると、HTMLサイトが作成され、出力はID付きのdivコンテナに格納されます。だからあなたが知らないでしようとしているのは、同じIDを持つ2つのdivコンテナを作成することです。これは動作しません。議論については、こちらをご覧ください:

lapply(1:2, function(nr){ 
    output[[paste0("plot", nr)]] <- renderPlot({hist(mtcars$mpg)})  
}) 

、その後plotOutput("plot1")plotOutput("plot2")を呼び出す:Can multiple different HTML elements have the same ID if they're different elements?

をあなたは何ができるかは、lapply()機能でサーバーのコードをラップし、2つのIDを生成することです。 conditionalPanels()との組み合わせで1つの出力のみを使用する他の方法もありますが、この方法はあなたにとってうまくいくはずです。

1

BigDataScientistの回答は素晴らしいと非常にスケーラブルです。

しかし、繰り返したい出力が1つまたは2つしかない状況では、最も簡単で最も読みやすい解決方法は、それらをすべて同じレンダリング機能に割り当てることです。たとえば、これは次のようになります。

output$plot1 <- output$plot2 <- renderPlot({ hist(mtcars$mpg) }) 

は、ここでは、このソリューションを使用して完全に動作するアプリです:

library(shiny) 

body <- dashboardBody(
    fluidRow(
    tabBox(title = "miles per gallon", id = "tabset1", height = "250px", 
     tabPanel("Tab1", plotOutput("plot1")), 
     tabPanel("Tab2", plotOutput("plot2"), "test") 
    ) 
) 
) 

shinyApp(
    ui = dashboardPage(
    dashboardHeader(title = "Test"), 
    dashboardSidebar(), 
    body 
), 
    server = function(input, output) { 
    output$plot1 <- output$plot2 <- renderPlot({ hist(mtcars$mpg) }) 
    } 
) 
関連する問題