2017-04-19 79 views
1

我的問題涉及觀察切換和取消切換閃爍BS中bsCollapsePanel標題的事件。shinyBS觀察切換bsCollapsePanel

讓我們考慮以下下面的應用爲例:

library(shiny) 
library(shinyBS) 
server = function(input, output, session) { 
    observeEvent(input$p1Button, ({ 
     updateCollapse(session, "collapseExample", open = "Panel 1") 
    })) 
    observeEvent(input$styleSelect, ({ 
     updateCollapse(session, "collapseExample", style = list("Panel 1" = input$styleSelect)) 
    })) 
    output$randomNumber <- reactive(paste0('some random number')) 
    } 


ui = fluidPage(
    sidebarLayout(
    sidebarPanel(HTML("This button will open Panel 1 using <code>updateCollapse</code>."), 
       actionButton("p1Button", "Push Me!"), 
       selectInput("styleSelect", "Select style for Panel 1", 
          c("default", "primary", "danger", "warning", "info", "success")) 
    ), 
    mainPanel(
     bsCollapse(id = "collapseExample", open = "Panel 2", 
       bsCollapsePanel("Panel 1", "This is a panel with just text ", 
           "and has the default style. You can change the style in ", 
           "the sidebar.", style = "info") 
    ), 
     verbatimTextOutput('randomNumber') 
    ) 
) 
) 

app = shinyApp(ui = ui, server = server) 

我希望應用程序能夠通過點擊在verbatimTextOutput('randomNumber')場每次我打開bsCollapsePanel一次打印一個隨機數(,使用R閃亮的反應性) Panel 1標題。

我在想這可能使用shinyjs包,但沒有找到這兩個包一起使用的很多例子。

回答

1

我不完全確定你想要什麼,但這可能是接近的。這些是增加:

  • 添加了一個observeEvent來監視您的Panel 1標題。
  • 增加了一個reactiveValues保持「隨機數」
  • 遞增計數,在上述observeEvent句柄值時Panel 1被推。

下面是代碼:

library(shiny) 
library(shinyBS) 
server = function(input, output, session) { 
    rv <- reactiveValues(number=0) 
    observeEvent(input$p1Button, ({ 
    updateCollapse(session, "collapseExample", open = "Panel 1") 
    })) 
    observeEvent(input$styleSelect, ({ 
    updateCollapse(session, "collapseExample", style = list("Panel 1" = input$styleSelect)) 
    })) 
    observeEvent(input$collapseExample, ({ 
    rv$number <- rv$number+1 
    })) 
    output$randomNumber <- reactive(rv$number) 
} 


ui = fluidPage(
    sidebarLayout(
    sidebarPanel(HTML("This button will open Panel 1 using <code>updateCollapse</code>."), 
       actionButton("p1Button", "Push Me!"), 
       selectInput("styleSelect", "Select style for Panel 1", 
          c("default", "primary", "danger", "warning", "info", "success")) 
    ), 
    mainPanel(
     bsCollapse(id = "collapseExample", open = "Panel 2", 
       bsCollapsePanel("Panel 1", "This is a panel with just text ", 
           "and has the default style. You can change the style in ", 
           "the sidebar.", style = "info") 
    ), 
     verbatimTextOutput('randomNumber') 
    ) 
) 
) 
shinyApp(ui = ui, server = server) 

以及相關截屏:

enter image description here

+0

優雅的解決方案。即使在運行之後,我也意識到我希望數字在我關閉面板後改變。但是因爲我只提到在我的問題中打開小組,所以你是第一個回答這個問題的小組對我來說是合情合理的。 – user974514

+0

我將不勝感激。隨意發佈另一個關於附加要求的問題,我相信有人會解決它 - 包括我,如果我找到時間。 –

2

好吧,邁克·懷斯是比我快:) 如果由於某種原因,我的解決辦法是也有幫助,讓我知道,否則我刪除它。

library(shiny) 
library(shinyjs) 
library(shinyBS) 

ui = fluidPage(
    useShinyjs(), 
    sidebarLayout(
    sidebarPanel(HTML("This button will open Panel1 using <code>updateCollapse</code>."), 
       actionButton("p1Button", "Push Me!"), 
       selectInput("styleSelect", "Select style for Panel1", 
          c("default", "primary", "danger", "warning", "info", "success")) 
    ), 
    mainPanel(
     bsCollapse(id = "collapseExample", open = "Panel 2", 
       bsCollapsePanel("Panel1", "This is a panel with just text ", 
           "and has the default style. You can change the style in ", 
           "the sidebar.", style = "info", id = "me23") 
    ), 
     verbatimTextOutput('randomNumber') 
    ) 
) 
) 

server = function(input, output, session) { 
    observeEvent(input$p1Button, ({ 
    updateCollapse(session, "collapseExample", open = "Panel1") 
    })) 
    observeEvent(input$styleSelect, ({ 
    updateCollapse(session, "collapseExample", style = list("Panel1" = input$styleSelect)) 
    })) 

    observe({ 
    runjs("function getAllElementsWithAttribute(attribute){ 
       var matchingElements = []; 
       var allElements = document.getElementsByTagName('*'); 
       for (var i = 0, n = allElements.length; i < n; i++) 
       { 
       if (allElements[i].getAttribute(attribute) !== null) 
       { 
       // Element exists with attribute. Add to array. 
       matchingElements.push(allElements[i]); 
       } 
       } 
       return matchingElements; 
       }; 
       ahref = getAllElementsWithAttribute('data-toggle'); 
       ahref[0].onclick = function() { 
       var nmbr = Math.random(); 
       Shiny.onInputChange('randomNumber', nmbr); 
       }; 
      ") 
    }) 
    output$randomNumber <- reactive(paste0(input$randomNumber)) 
} 




shinyApp(ui = ui, server = server) 

Javascript代碼,你可以在這裏找到: Get elements by attribute when querySelectorAll is not available without using libraries?

+0

我認爲這是有用的代碼,儘管對於這個特定的場景可能是矯枉過正。但是,從長遠來看,他可能更適合他的意圖。 –

+0

我同意我也試着第一次使用'input $ collapseExample'工作,但不知何故,我似乎不得不錯過smthg,因爲它沒有爲我工作。 +1爲你更優雅的解決方案:)。 – BigDataScientist

+1

同上您的更有趣的解決方案。實際上研究它,一定能夠在某一天使用。 –