2017-03-06 33 views
0

在Rmarkdown動態標籤,它可以創建標籤,例如:創建於Rmarkdown

--- 
output: html_document 
--- 

# Tabs {.tabset} 

## Tab 1 

foo 

## Tab 2 

bar 

我不知道是否有可能創建的標籤任意數量?如何以編程方式創建選項卡?

以下代碼很難做到這一點,但它會產生一個標題而不是標籤。

--- 
output: html_document 
--- 

# Tabs {.tabset} 

```{r echo=FALSE} 
shiny::tags$h2("Tab 1") 
``` 

foo 

## Tab 2 

bar 

解決方案

感謝@GGamba提供一個很好的解決方案。我需要更進一步,並能夠將選項卡添加爲循環的一部分,因此我需要進行兩項更改。首先,我用這個代碼,動態地添加標籤(這裏唯一的區別是,我強迫的hrefCode評價超時內,否則召集所有超時將使用相同的值)

(function(hrefCode){setTimeout(function(){ 
var tabContent = document.createElement('div'); 
var tabContainerTarget = document.getElementsByClassName('tab-content')[0]; 

    tabContent.setAttribute('id', 'tab-' + hrefCode); 
    tabContent.setAttribute('class', 'tab-pane') 
    tabContent.innerHTML = '", gsub('\n', '', Panel, fixed = TRUE), "'; 

    tabContainerTarget.appendChild(tabContent); 
    }, 100); 
})(hrefCode); 

其次,添加標籤在一個循環中,你可以做這樣的事情:

tabsToAdd <- list("tab3" = "hello", "tab4" = "world") 

shiny::tagList(lapply(names(tabsToAdd), function(x) { 
    addToTabset(title = x, tabsetId = 'tbSet1', 
       tabPanel(x, tabsToAdd[[x]])) 
})) 

回答

1

據我知道你正在嘗試做的是不是在rmarkdown可能(但我很樂意指正)。但是我們當然可以實現一個功能來做到這一點。

我根據我的回答this回答@KRohde,所以所有的積分都歸他。我只是調整它在一個簡單的降價文件中工作。

答案大多與JS,而不是R建立,但由於降價主要是一個HTML我覺得JS是更好的工具。

下面是代碼:

--- 
output: html_document 
--- 


```{r echo=FALSE, results='asis'} 
library(shiny) 
addToTabset <- function(title, tabsetId, Panel) { 

    tags$script(HTML(paste0(" 
        /* Getting the right tabsetPanel */ 
        var tabsetTarget = document.getElementById('", tabsetId, "'); 

        /* Creating 6-digit tab ID and check, whether it was already assigned. */ 
        hrefCode = Math.floor(Math.random()*100000); 

        /* Creating node in the navigation bar */ 
        var navNode = document.createElement('li'); 
        var linkNode = document.createElement('a'); 

        linkNode.appendChild(document.createTextNode('", title, "')); 
        linkNode.setAttribute('data-toggle', 'tab'); 
        linkNode.setAttribute('data-value', '", title, "'); 
        linkNode.setAttribute('href', '#tab-' + hrefCode); 

        navNode.appendChild(linkNode); 
        tabsetTarget.appendChild(navNode); 
        setTimeout(function(){ 
        var tabContent = document.createElement('div'); 
        var tabContainerTarget = document.getElementsByClassName('tab-content')[0]; 

         tabContent.setAttribute('id', 'tab-' + hrefCode); 
         tabContent.setAttribute('class', 'tab-pane') 
         tabContent.innerHTML = '", gsub('\n', '', Panel, fixed = T), "'; 

         tabContainerTarget.appendChild(tabContent); 
         }, 100); 
        ") 
)) 
} 

``` 

上面的代碼應該留在「設置塊」,因爲它定義R函數調用JS功能大多隻是加上正確的事情的DOM。

它可以在需要時使用,通過tabPanel標題,'目標'tabset和正常tabPanel函數。

```{r results='asis', echo=FALSE} 

shiny::tabsetPanel(id = 'tbSet1', 
        shiny::tabPanel('Tab 1', 'foo'), 
        shiny::tabPanel('Tab 2', 'bar') 
) 
``` 



```{r results='asis', echo=FALSE} 

addToTabset(title = 'Tab 3', 
      tabsetId = 'tbSet1', 
      tabPanel(
       h1('This is a title'), 
       actionButton('btn',label = 'Clicky button'), 
       radioButtons('asd', LETTERS[1:5], LETTERS[1:5]))) 

``` 
+0

如果光澤本身不能做,那是一個很好的解決方法。你是否也有一個解決方案來完成這個循環,例如。 'lapply(字母,函數(字母)addToTabset(字母,'tbSet1',tabPanel(字母,字母)))'?我不擅長高級Rmd以及如何讓html正確呈現 –

+0

想通了。不得不將這個循環包裝在'tagList()'中,並且還需要在javascript中進行一些修復(請參閱問題本身,以獲取修改後的代碼) –