web-dev-qa-db-ja.com

独自のサイドバーとmainPanelを備えたタブを光沢のある状態で使用できますか?

タブごとに異なる入力を表示したいと思います。そこで、いくつかのtabPanelを使用してページを作成しようとしました。しかし、私は以下のようなsthを持つことはできません:

library(shiny)

shinyUI(pageWithSidebar(
  headerPanel("Header"),

  tabsetPanel(
    tabPanel(
      headerPanel("Tab 1"),
      sidebarPanel(
        selectInput("var", "Parametre", choices = c("1", "2", "3"))
        ),
      mainPanel(
        textOutput("text1")
        )
      ),
    tabPanel(
      headerPanel("Tab 2"),
      sidebarPanel(
        selectInput("var", "Parametre", choices = c("21", "22", "23"))
      ),
      mainPanel(
        textOutput("text2")
      )
    )
    )
  ))

pageWithSidebarが問題の原因であると思われますが、Googleグループで代替手段を見つけることができませんでした。独自のサイドバーとmainPanelで複数のタブを表示する方法はありますか、それともこの目的のために別のアプリを作成する必要がありますか?

24
barerd

私があなたの質問を誤解しないのであれば、tabsetPanel関数(ここではid = "conditionedPanels")のIDを指定することで、jQueryの部分(@ f1r3br4ndの回答から)を回避することもできると思います。 valueパラメータ(つまり、メインパネルでどのタブが選択されているか)は、input変数を介して使用できます。

最小限の例server.Rは、shinyServer関数のスケルトンを除いて空の場合があります。 ui.Rファイルは次のようになります。

shinyUI(pageWithSidebar(
  headerPanel("Conditional Panels"),
  sidebarPanel(
    conditionalPanel(condition="input.conditionedPanels==1",
                     helpText("Content Panel 1")
    ),
    conditionalPanel(condition="input.conditionedPanels==2",
                     helpText("Content Panel 2")
    ) 
  ),
  mainPanel(
    tabsetPanel(
      tabPanel("Panel 1", value=1), 
      tabPanel("Panel 2", value=2)
      , id = "conditionedPanels"
    )
  )
))
24
Mark Heckmann

シャイニーのサンプルアプリのようにsidebarPanelを1つだけ持っていて、それをsidebarPanelでラップすることで動作するようになりました。これは、個別のconditionalPanel呼び出しの特定のタブ専用です。 ここ 。秘訣は、conditionalPanelの条件引数である文字列を、現在選択されているタブのhtml属性を調べ、===sの名前に変換するjQueryステートメントにすることです。このコンテンツがサイドバーに表示されるタブ:

conditionalPanel(
    "$('li.active a').first().html()==='Foo'",
    actionButton("bar","Bar"));

...ここで、Fooはタブのタイトルです。

要するに、1つのサイドバーですが、その内容はアクティブなタブを条件としています。

10
bokov

これが古い投稿であることは知っていますが、同様の質問に対する答えを探していたときに偶然見つけました。 (fluidPageの代わりに)pageWithSidebarを使用し、次に各sidebarLayouttabPanels関数を使用することで、目的を達成することもできると思います。

例:

library(shiny)

ui <- fluidPage(
  headerPanel("Header"),
  tabsetPanel(
    tabPanel('Tab 1',
             sidebarLayout(
               sidebarPanel(
                 selectInput("var", "Parametre", choices = c("1", "2", "3"))
               ),
               mainPanel(
                 textOutput("text1")
               )
             )  
    ),
    tabPanel('Tab 2',
             sidebarLayout(
               sidebarPanel(
                 selectInput("var", "Parametre", choices = c("21", "22", "23"))
               ),
               mainPanel(
                 textOutput("text2")
               )
             )
    )
  )
)

server <- function(input, output) {}

shinyApp(ui, server)
1
jimmymac387