2016-09-27 10 views
3

私は動的なrmarkdown文書の作成に取り組んでいます。最終結果は、データ内の各「分類」のためのタブを作成する必要があります。各タブには、DTパッケージのデータテーブルが印刷されている必要があります。以下は、私が使用しているコードです:私は、DataTableの機能に直接呼び出しをコメントアウトしているrmarkdownでループするときにdatatableが印刷されないのはなぜですか?

--- 
output: html_document 
--- 

# Setup{.tabset} 
```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = FALSE) 
library(knitr) 
library(DT) 
``` 

```{r data.setup} 
set.seed = 1242 
rows = 64 
data.1 = runif(rows, 25, 75) 
data.2 = runif(rows, .01, 1) 
data.3 = runif(rows, 1, 10) 
classification = c("A", "B", "C", "D") 
df = data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification)) 
df$data.1 = as.numeric(df$data.1) 
df$data.2 = as.numeric(df$data.2) 
df$data.3 = as.numeric(df$data.3) 
``` 

```{r results= 'asis'} 
for(j in levels(df$classification)){ 
     df.j = df[df$classification == j, ] 
     cat(paste("\n\n## Classification: ", j, "##\n")) 
     w = datatable(df.j) 
     #datatable(df.j) 
     print(w) 
} 
``` 

お知らせは、それらはrmarkdownする印刷ませんでした。書かれた呼び出しの結果は正しいタブを持つhtmlドキュメントを生成しますが、そこにはデータテーブルはありません。さらに、データセットは実際にはRStudioセッションで正しいサブセットで表示されます。テストとして、knitrのkable関数を使用して目標を達成しようとしましたが、テーブルは適切なタブに印刷されました。残念ながら、kableは必要な機能をすべて備えていません。

答えて

3

これはまだ完全には解明されていませんが、これはまだ私に困惑していますが、少なくともこれはあなたを理解していくためには十分です。

--- 
output: html_document 
--- 

# Setup{.tabset} 
```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = FALSE) 
library(knitr) 
library(DT) 
``` 

```{r data.setup} 
set.seed <- 1242 
rows <- 64 
data.1 <- runif(rows, 25, 75) 
data.2 <- runif(rows, .01, 1) 
data.3 <- runif(rows, 1, 10) 
classification <- c("A", "B", "C", "D") 
df <- data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification)) 
df$data.1 <- as.numeric(df$data.1) 
df$data.2 <- as.numeric(df$data.2) 
df$data.3 <- as.numeric(df$data.3) 
``` 

```{r include = FALSE} 
# Why, oh why do I need this chunk? 
datatable(df) 
``` 

```{r results = 'asis'} 
for(j in unique(df$classification)){ # You were using level() here, so your for-loop never got off the ground 
     df.j <- df[df$classification == j, ] 
     cat(paste("\n\n## Classification: ", j, "##\n")) 
     print(htmltools::tagList(datatable(df.j))) 
} 

これが機能するには3番目のチャンクが必要ですが、その理由はまだわかりません。

+0

+1私はシンプルなソリューションのために広範囲に検索してきたし、これはそれでした。 3番目のチャンクでは 'datatable(df [1、]) 'と入力することができます。 @yihuiがなぜこれが必要なのか分かっているのだろうか? – bouncyball

1

ここには同じ質問があります。これは私のために働いた:https://gist.github.com/ReportMort/9ccb544a337fd1778179

レンダリングされたティブルのリストを生成し、手動でknitを呼び出します。ここで

は、上記のリンクで見られる技術を使用して、あなたの例に基づいて作業RMDです:

--- 
output: html_document 
--- 

# Setup{.tabset} 
```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = FALSE) 
library(knitr) 
library(DT) 
``` 

```{r data.setup} 
set.seed <- 1242 
rows <- 64 
data.1 <- runif(rows, 25, 75) 
data.2 <- runif(rows, .01, 1) 
data.3 <- runif(rows, 1, 10) 
classification <- c("A", "B", "C", "D") 
df <- data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification)) 
df$data.1 <- as.numeric(df$data.1) 
df$data.2 <- as.numeric(df$data.2) 
df$data.3 <- as.numeric(df$data.3) 
``` 

```{r include = FALSE} 
# prepare a list of 4 sub-dataframes, each corresponding to one classification 
df_list <- split(df, df$classification) 
``` 

```{r create-markdown-chunks-dynamically, include=FALSE} 

out = NULL 
for (c in names(df_list)) { 
    knit_expanded <- paste0("\n\n## Classification: ", c, "##\n\n```{r results='asis', echo=FALSE}\n\ndatatable(df_list[['", c, "']])\n\n```") 
    out = c(out, knit_expanded) 
} 

``` 

<!--- knit those table chunk statements --> 
`r paste(knit(text = out), collapse = '\n')` 
関連する問題